关于点击不同物品触发不同事件
可以实现在界面中点击不同的物体,移动到物品附近位置,然后触发对应的事件。
首先建立一个公共管理的类:
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 updateprivate NavMeshAgent PlayerAgent;void Start(){PlayerAgent = GetComponent<NavMeshAgent>();//获取寻路组件}// Update is called once per framevoid 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;//停止距离为0PlayerAgent.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,可以研究一下。