UGUI 3d坐标转UI坐标

本文介绍了一个Unity中的示例脚本,用于将3D世界中的立方体位置转换到UI坐标上显示。通过使用WorldToScreenPoint方法将3D坐标转换为屏幕坐标,并利用RectTransformUtility将屏幕坐标转换为UI坐标。


UGUI 3d坐标转UI坐标





public class CubePosToGUI : MonoBehaviour
 {
  public Canvas TheCanvas;
  public GameObject CubeObj;

 private RectTransform canvasRectTrans;
  private RectTransform textRectTrans;

 void Start()
  {
   canvasRectTrans = TheCanvas.GetComponent();
   textRectTrans = GetComponent();
  }

 void Update()
  {
   Vector3 screenVec3Pos;
   screenVec3Pos = Camera.main.WorldToScreenPoint (CubeObj.transform.position);

  Vector2 screenVec2Pos = new Vector2 (screenVec3Pos.x, screenVec3Pos.y);

  Vector2 textPos;

  RectTransformUtility.ScreenPointToLocalPointInRectangle (canvasRectTrans,
                                                            screenVec2Pos,
                                                            TheCanvas.worldCamera,
                                                            out textPos);
   textRectTrans.anchoredPosition = textPos;
  }
 }

 

 

 

或者

public class CubePosToGUI : MonoBehaviour
 {
  public GameObject CubeObj;

 

 void Update()
  {
   Vector3 screenVec3Pos;
   screenVec3Pos = Camera.main.WorldToScreenPoint (CubeObj.transform.position);

  transform.position = screenVec3Pos;
  }
 }



转:http://blog.sina.com.cn/s/blog_47e8dc5c0102w59o.html

在Unity 3D中,将3D位置换为UI坐标有多种方法: 1. **换到屏幕最上方的NGUI位置**:通过将3D位置换为视口坐标,再计算屏幕最上方的视口坐标,最后换为世界坐标。 ```csharp public static Vector3 TopNgui(Vector3 _3dPos) { Vector3 pos = _3dCamera.WorldToViewportPoint(_3dPos); Vector3 ViewportScreenTop = new Vector3(pos.x, 1f); _uiLabel.transform.position = _2dCamera.ViewportToWorldPoint(ViewportScreenTop); pos = _uiLabel.transform.localPosition; pos.x = Mathf.FloorToInt(pos.x); pos.y = Mathf.FloorToInt(pos.y); pos.z = 0f; _uiLabel.transform.localPosition = pos; return pos; } ``` 2. **根据Canvas设置换为uGUI可使用的坐标**:先将3D位置换为视口坐标,再根据Canvas的大小计算出uGUI坐标。 ```csharp public Vector2 GetUIPosByViewport(Transform objTrm) { Vector3 viewportPos = Camera.main.WorldToViewportPoint(objTrm.position); Canvas canvas = GetComponent<Canvas>(); RectTransform canvasRtm = canvas.GetComponent<RectTransform>(); Vector2 uguiPos = Vector2.zero; uguiPos.x = viewportPos.x * canvasRtm.sizeDelta.x; uguiPos.y = viewportPos.y * canvasRtm.sizeDelta.y; return uguiPos; } ``` 3. **使用`RectTransformUtility`换**:先将3D位置换为屏幕坐标,再换为Canvas内的本地坐标。 ```csharp public class Game3DPosToUIPosMyTest : MonoBehaviour { public Transform targetTran; public RectTransform hpTran; public Camera uiCamera; public RectTransform canvasTran; private Vector2 offsetY = new Vector2(0, 100); private void Update() { Vector2 screenPoint = RectTransformUtility.WorldToScreenPoint(Camera.main, targetTran.position); Vector2 localPoint; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasTran, screenPoint, uiCamera, out localPoint)) { hpTran.anchoredPosition = localPoint + offsetY; } } } ``` 4. **简单的3D2D屏幕坐标**:使用`Camera.main.WorldToScreenPoint`方法,可根据需求添加偏移。 ```csharp Camera.main.WorldToScreenPoint(target.position) + new Vector3(-Screen.width / 2, -Screen.height / 2); ``` 5. **使用`RectTransformUtility`的另一种实现**:先将3D位置换为屏幕坐标,再换为Canvas内的本地坐标。 ```csharp public class CubePosToGUI : MonoBehaviour { public Canvas TheCanvas; public GameObject CubeObj; private RectTransform canvasRectTrans; private RectTransform textRectTrans; void Start() { canvasRectTrans = TheCanvas.GetComponent<RectTransform>(); textRectTrans = GetComponent<RectTransform>(); } void Update() { Vector3 screenVec3Pos; screenVec3Pos = Camera.main.WorldToScreenPoint(CubeObj.transform.position); Vector2 screenVec2Pos = new Vector2(screenVec3Pos.x, screenVec3Pos.y); Vector2 textPos; RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRectTrans, screenVec2Pos, TheCanvas.worldCamera, out textPos); textRectTrans.anchoredPosition = textPos; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值