答案来源于https://answers.unity.com/questions/1823238/how-do-i-convert-gameobjects-position-to-position.html
//先将物体的世界坐标转化成相机的视口坐标,viewPos即为坐标占屏幕的比例
Vector3 viewPos = camera.WorldToViewportPoint(obj.transform.position);
//将比例和设置的Canvas分辨率相乘得到屏幕坐标
Vector3 screenPos = viewPos.Scale(new Vector3(Screen.width,Screen.height,1f));
transform.position = screenPos;
以物体在RawImage上的坐标举例:
实现效果:
当场景中的空物体在正方体的这个位置时,空物体在RawImage上的位置如图所示(在UI上用Button代表空物体的位置):
实现原理:
先将物体的世界坐标通过WorldToViewportPoint()转化成视口坐标,用视口坐标乘canvas的宽高,得到物体在canvas上的坐标,再根据RawImage在canvas中的位置进行宽高的缩放,获得物体在RawImage上的坐标
实现代码:
private void SetPos(GameObject obj)
{
Vector3 viewPos = camera.WorldToViewportPoint(obj.transform.position);
Debug.Log("viewPos:" + viewPos);
viewPos.Scale(new Vector3(Screen.width, Screen.height, 1f));
viewPos = new Vector3(rawImage.rect.width / Screen.width * viewPos.x + (Screen.width - rawImage.rect.width) / 2,
rawImage.rect.height / Screen.height * viewPos.y + (Screen.height - rawImage.rect.height) / 2,
viewPos.z);
Debug.Log("viewPos2:" + viewPos);
transform.position = viewPos;
}