天天看點

UGUI 和世界坐标的轉換

需求一 :讓UGUI中的UI随着場景中的模型位置而移動,類似人物血條,這裡需要移動的是UI

需求二:讓場景中的模型位置随着UI移動而變化,這裡移動的是模型位置。

這兩個需求正是對UGUI和世界坐标的轉換的應用。

當canvas的render模式是overlay的時候,這個時候隻有一個相機,即世界相機,沒有所謂UI相機,ui坐标就是螢幕坐标。

     Transform target;//模型

    Camera worldcamera;//世界相機

    RectTransform m_ui;//ui

    RectTransform m_canvas;//ui canvas

一 解決需求一:

    vector3 screenpos = worldcamera.WorldToScreenPoint(target.position);//把模型坐标轉為螢幕坐标

    vector2 temp = vector2.zero;

    vector2 uipos= vector2.zero;

    temp.set(screenpos.x,screenpos.y);

   RectTransformUtility.ScreenPointToLocalPointInRectangle(m_canvas, //需要求取的ui所在的canvas

          temp,//螢幕坐标

          null, //因為是overlay所有不存在相機

          out uipos);//把螢幕坐标轉為ui坐标

   m_ui.anchoredPosition = uipos;

二 解決需求二:

    變量如上

    vector3 worldpos;

    temp.set(m_ui.position.x,m_ui.position.y);

    RectTransformUtility.ScreenPointToWorldPointInRectangle(m_canvas, //ui所在的canvas

          temp,//螢幕坐标

          worldcamera, //求取渲染模型所用的相機

          out worldpos);//ui對應的模型坐标

  target.position = worldpos;

當canvas的render模式是camera的時候,隻需要把解決需求一中的null換成UI相機即可。

繼續閱讀