此方法是将世界坐标转换为屏幕坐标,并实现UI的缩放移动效果,具体情况具体分析。
应用于3D场景中有很多3DUI界面,功能如下所示。【效果>>>>从哪里来到哪里去<<<<】
- 点击3DUI界面转换为2DUI界面,并放大移动到屏幕中心显示
- 点击已点击过3DUI界面或其它3DUI界面,显示的2DUI界面缩小回原处并放大新点击的3DUI界面
- 给2DUI界面添加Button按钮,点击2DUI界面缩小返回到3DUI界面位置点
详细代码如下
//加载数据UI界面
private GameObject dataPanel;
private Text dataName, value;
GameObject dataUIParent;
public void WorldToScrennPoint(GameObject _parent)
{
mask = 1 << 15;//实例化mask自定义的层级之上;
dataUIParent = _parent;
var _dataUI = Resources.Load<GameObject>("factory/DataUI");
dataPanel = GameObject.Instantiate(_dataUI) as GameObject;
dataPanel.transform.SetParent(dataUIParent.transform, false);
dataName = dataPanel.transform.Find("lineBg/name").GetComponent<Text>();
value = dataPanel.transform.Find("lineBg/Value").GetComponent<Text>();
dataPanel.transform.FindChild("lineBg").GetComponent<UnityEngine.UI.Button>().onClick.AddListener(() =>
{
DataUIShrink();//缩小UI界面
});
}
//用于检测数据UI界面信息
public LayerMask mask = 1 << 15;//实例化mask自定义的层级之上;
GameObject gameObj;
Vector2 screenPos;
Tweener scaleTweener;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//创建射线;从摄像机发射一条经过鼠标当前位置的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, 500, mask.value))
{
if (dataPanel.transform.localScale == Vector3.zero)
{
gameObj = hitInfo.collider.gameObject;
//赋值
dataName.text = hitInfo.transform.parent.parent.parent.name;
value.text = gameObj.GetComponent<Text>().text;
DataUIMagnify();//放大UI
}
else
{
DataUIShrink(); //缩小UI界面
gameObj = hitInfo.collider.gameObject;
//赋值
dataName.text = hitInfo.transform.parent.parent.parent.name;
value.text = gameObj.GetComponent<Text>().text;
scaleTweener.OnComplete(DataUIMagnify);//缩小后放大点击的另一个UI界面
}
}
Debug.DrawLine(ray.origin, hitInfo.point, Color.red);
}
}
//将点击的物体坐标转换为屏幕坐标-----------UI界面放大移动
private void DataUIMagnify()
{
screenPos = Camera.main.WorldToScreenPoint(gameObj.transform.position);//世界坐标转屏幕坐标
dataPanel.transform.position = screenPos;
dataPanel.transform.DOScale(Vector3.one, 0.3f);
dataPanel.transform.DOLocalMove(Vector3.zero, 0.3f);
}
//将点击的物体坐标转换为屏幕坐标-----------UI界面缩小移动
private void DataUIShrink()
{
if (gameObj == null)
return;
screenPos = Camera.main.WorldToScreenPoint(gameObj.transform.position);//世界坐标转换为屏幕坐标
dataPanel.transform.DOScale(Vector3.zero, 0.3f);
scaleTweener = dataPanel.transform.DOMove(screenPos, 0.3f);
Debug.LogError("缩小");
}