88 lines
3.0 KiB
C#

using UnityEngine;
/// <summary>
/// 物体跟随鼠标移动
/// </summary>
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<Rigidbody>().useGravity = false;
transform.GetComponent<BoxCollider>().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<PathManager>();
}
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<Rigidbody>().AddForce(force * 15.0f);
}
}
}
}
}
/// <summary>
/// 跟随鼠标移动函数
/// </summary
private void Follow()
{
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _cameraToGeoDistance);
transform.position = Camera.main.ScreenToWorldPoint(mousePos);
}
}
}