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);
    }

 

posted @ 2026-03-27 14:22  剑起苍穹  阅读(7)  评论(0)    收藏  举报
/*鼠标点击特效*/