88 lines
3.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|