Unity点击图标定位物体的位置(按物体的中心点位置)
简单记录一下,
直接挂载一个空物体即可使用
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraUITB : MonoSingleton<CameraUITB> { public Transform clonePrefab; //UI预制体 public Transform uitrans;//UI父物体 public Transform objtrans; //物体位置的父物体 private bool isbool = false; private List<Transform> cameraLists = new List<Transform>(); // Start is called before the first frame update void Start() { for (int i = 0; i < objtrans.childCount; i++) { Transform trans = Instantiate(clonePrefab, uitrans); trans.name = objtrans.GetChild(i).name; cameraLists.Add(objtrans.GetChild(i)); } } //相机定位物体名字 public void CameraDWPosition(string strname) { for (int i = 0; i < cameraLists.Count; i++) { if (cameraLists[i].name ==strname) { Vector3 modelPos = GetCenter(cameraLists[i]) + new Vector3(0, GetBigF(cameraLists[i]), -GetBigF(cameraLists[i])); SetCameraPath.Instance.CameraMoveTo(modelPos, new Vector3(40, 0, 0), 2f); } } } //计算偏移量 float GetBigF(Transform _target) { float X = _target.GetComponent<MeshFilter>().mesh.bounds.size.x * _target.transform.lossyScale.x; float Y = _target.GetComponent<MeshFilter>().mesh.bounds.size.y * _target.transform.lossyScale.y; float Z = _target.GetComponent<MeshFilter>().mesh.bounds.size.z * _target.transform.lossyScale.z; float myBig = 0; if (X >= Y) { myBig = X; } else { myBig = Y; } if (myBig <= Z) { myBig = Z; } if (myBig < 2) { myBig += 2; } return myBig; } //计算中心点位置 Vector3 GetCenter(Transform _target) { return _target.GetComponent<MeshCollider>().bounds.center; } public void SureUIPrefabPos(Transform _modelTrans, Transform _UITrans, Vector3 _v) { for (int i = 0; i < _modelTrans.childCount; i++) { Vector3 _pos = _modelTrans.GetChild(i).position + _v; float das = Vector3.Distance(Camera.main.transform.position, _pos); Vector3 VectorUI = Camera.main.WorldToScreenPoint(_pos); if (VectorUI.z > 0 && das < 3000) { _UITrans.GetChild(i).GetComponent<RectTransform>().position = new Vector3(VectorUI.x, VectorUI.y, 0); } else { _UITrans.GetChild(i).GetComponent<RectTransform>().position = new Vector3(-100, -100, -100); } } } // Update is called once per frame void Update() { if (isbool) { SureUIPrefabPos(objtrans, uitrans, Vector3.zero); } if (Input.GetKeyDown(KeyCode.H)) { isbool = true; uitrans.gameObject.SetActive(true); } if (Input.GetKeyDown(KeyCode.J)) { isbool = false; uitrans.gameObject.SetActive(false); } } }
另外一种,定位的时候相机不旋转,只定位位置
//模型移动 Vector3 _v = Vector3.zero; public void ModelToMoveFunc(Transform _obj) { //判断是否时间仰视还是俯视,只有俯视视角才会移动定位 if (GamerManager.Instance.cameramain.transform.localEulerAngles.x <= 180) { _v = _obj.GetComponent<MeshCollider>().bounds.center - GamerManager.Instance.cameramain.transform.forward * GetBigF(_obj.transform)*2; //myCam.transform.DOMove(_v, 0.5f).SetId(100); CameraMoveTo(_v, new Vector3(40, 0, 0), 2f); } }
public void CameraMoveTo(Vector3 trans,Vector3 rot, float time) { DOTween.Kill(1000); cameramain.transform.DOMove(trans, time).SetEase(Ease.Linear).SetId(1000); //cameramain.transform.DORotate(rot, time).SetEase(Ease.Linear).SetId(1000); }

浙公网安备 33010602011771号