可以实现在界面中点击不同的物体,移动到物品附近位置,然后触发对应的事件。
首先建立一个公共管理的类:
public class InteractionObject : MonoBehaviour
{
private NavMeshAgent PlayerAgent;
private bool haveinteracted=false;//用于判断方法已经调用
public void OnClick(NavMeshAgent PlayerAgent)
{
this.PlayerAgent = PlayerAgent;
PlayerAgent.stoppingDistance = 2;//寻路停止距离
PlayerAgent.SetDestination(transform.position);//移动到寻路点
haveinteracted = false;
}
private void Update()
{
if (PlayerAgent != null&&haveinteracted==false&&PlayerAgent.pathPending==false)//后边是判断路径是否计算完成
{
if (PlayerAgent.remainingDistance <= 2)//距离目标点的距离是否小于2米
{
Interact();//调用Interact()方法
haveinteracted = true;
}
}
}
protected virtual void Interact() //便于重写
{
print("点到了什么东西了");
}
}
创建角色点击移动并判断点到了什么东西的脚本:
public class PlayerRoutine : MonoBehaviour
{
// Start is called before the first frame update
private NavMeshAgent PlayerAgent;
void Start()
{
PlayerAgent = GetComponent<NavMeshAgent>();//获取寻路组件
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))//点击鼠标左键
{
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);//创建一条射线
RaycastHit hit;
bool isCollide = Physics.Raycast(ray, out hit);
if (isCollide)
{
if (hit.collider.tag == "Ground")//假如点击物体的标签为Ground
{
PlayerAgent.stoppingDistance = 0;//停止距离为0
PlayerAgent.SetDestination(hit.point);//移动到点击位置
}
else if (hit.collider.tag == "NPC") //假如点击物体的标签为NPC
{
hit.collider.GetComponent<InteractionObject>().OnClick(PlayerAgent);//调用InteractionObject中的Onclick方法
}
else if (hit.collider.tag == "Item")
{
hit.collider.GetComponent<InteractionObject>().OnClick(PlayerAgent);
}
}
}
}
}
接下来给不同的物体写不同的事件,通过重写Interact的方法实现,比如说点到了NPC:
public class NPCObject : InteractionObject//继承公共管理类
{
protected override void Interact()//重写Interact方法
{
print("我就是NPC!");
}
}
点到物品
public class ItemObject : InteractionObject
{
protected override void Interact()
{
print("我就是个东西!");
}
}
最上边是一个简单的相关Demo,可以研究一下。