using UnityEngine; /// /// 物体跟随鼠标移动 /// namespace ZXK.GYJQR { public class FollowMouse : MonoBehaviour { private bool _isFollow = false; public bool isFollow { get { return _isFollow; } set { _isFollow = value; if (_isFollow) { Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position); _cameraToGeoDistance = screenPos.z; transform.GetComponent().useGravity = false; transform.GetComponent().isTrigger = true; _addForceNumber = 0; } IsLimitFollow = _isFollow; } }//是否跟随移动 [System.NonSerialized]//摄像机和物体之间距离 private float _cameraToGeoDistance = 0.1f; [HideInInspector] public PathManager pm;//当前物体上携带的路径动画组件 [HideInInspector] public BoundTrigger _boundTrigger;//边缘检测对象 //用于限制鼠标移动 public float MaxLineLength = 1.0f; public bool IsLimitFollow = false; private int _addForceNumber = 0;//如果鼠标拖拽物体超出范围,给一次向内的力 private void Start() { pm = GetComponent(); } public void Update() { if (isFollow == false) { return; } Follow(); } private void FixedUpdate() { if (IsLimitFollow && pm.limitCenterTran && _boundTrigger) { Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _cameraToGeoDistance); Vector3 mousePosGeo = Camera.main.ScreenToWorldPoint(mousePos); float mouseDistance = Vector3.Distance(mousePosGeo, pm.limitCenterTran.position); //WDebug.Log(mousePosGeo + "鼠标距离:" + mouseDistance); if (mouseDistance > pm.maxValue || mousePosGeo.y < pm.limitYPos) { if (_boundTrigger) { _boundTrigger.onOutEdge?.Invoke(); if (!_boundTrigger.OnNearEdge(transform.tag) && _addForceNumber == 0) { _addForceNumber++; Vector3 force = (pm.limitCenterTran.position - transform.position).normalized; transform.GetComponent().AddForce(force * 15.0f); } } } } } /// /// 跟随鼠标移动函数 ///