使用方式:
isCanMove | 是否可以移动对象 | ||||||
Camera | 当前摄像机 | ||||||
Length | 射线长度 | ||||||
Move Speed | 移动速度 | ||||||
End Distance | 结束距离 | ||||||
Ground Floor Name | 碰撞层的名字 | ||||||
Mouse Click | 检测的鼠标按键 | ||||||
事件 |
|
using UnityEngine.EventSystems;
using UnityEngine;
using System;
public enum MouseCode
{
LeftButton,
RightButton,
MiddleButton
}
public class ClickMove : MonoBehaviour {
public bool isCanMove = true;
public new Camera camera;
public int length = 1000;
public float moveSpeed;
public float endDistance=0.5f;
public string groundFloorName;
public MouseCode mouseClick;
public delegate void MoveEvent(Vector3 posintion);
public event MoveEvent StartMove;
public event MoveEvent Moveing;
public event MoveEvent EndMove;
private Vector3 offset;
private Vector3 targetPosition;
private RaycastHit info;
private bool isMove = false;
private Transform myTr = null;
private Transform MyTr
{
get{
return myTr ?? (myTr = transform);
}
}
public void SetTargetPosition(Vector3 position)
{
isMove = true;
targetPosition = position;
if (null != StartMove)
StartMove(MyTr.position);
}
private void Update()
{
if (!isCanMove)
return;
if (null == camera || string.Empty == groundFloorName)
return;
if (Input.GetMouseButtonDown((int)mouseClick))
{
if(null != EventSystem.current)
{
if (EventSystem.current.IsPointerOverGameObject())
return;
}
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out info, length, LayerMask.GetMask(groundFloorName)))
SetTargetPosition(info.point);
}
if (isMove)
{
offset = targetPosition - MyTr.position;
MyTr.position += offset.normalized * Time.deltaTime * moveSpeed;
if (null != Moveing)
Moveing(MyTr.position);
if (Vector3.Distance(targetPosition, MyTr.position) <= endDistance)
{
isMove = false;
targetPosition.y = MyTr.position.y;
MyTr.position = targetPosition;
if (null != EndMove)
EndMove(MyTr.position);
}
}
}
}