Unity 关于点击不同物品移动并触发不同事件

关于点击不同物品触发不同事件

可以实现在界面中点击不同的物体,移动到物品附近位置,然后触发对应的事件。

首先建立一个公共管理的类:

csharp 复制代码
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("点到了什么东西了");
    }
}

创建角色点击移动并判断点到了什么东西的脚本:

csharp 复制代码
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:

csharp 复制代码
public class NPCObject : InteractionObject//继承公共管理类
{
    protected override void Interact()//重写Interact方法
    {
        print("我就是NPC!");
    }
}

点到物品

csharp 复制代码
public class ItemObject : InteractionObject
{
    protected override void Interact()
    {
        print("我就是个东西!");
    }
}

最上边是一个简单的相关Demo,可以研究一下。

相关推荐
_乐无7 小时前
Unity 性能优化方案
unity·性能优化·游戏引擎
明明明h9 小时前
Unity Assembly Definition & Assembly Definition Reference
unity·游戏引擎
龙中舞王10 小时前
Unity学习笔记(4):人物和基本组件
笔记·学习·unity
无敌最俊朗@13 小时前
unity3d————协程原理讲解
开发语言·学习·unity·c#·游戏引擎
夜色。13 小时前
Unity6 + Android Studio 开发环境搭建【备忘】
android·unity·android studio
这不比博人传燃?18 小时前
传奇996_19——常用函数
游戏引擎
erxij19 小时前
【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看
c++·经验分享·游戏·3d·游戏引擎
咩咩觉主21 小时前
尽量通俗易懂地概述.Net && U nity跨语言/跨平台相关知识
unity·c#·.net·.netcore
墨笺染尘缘1 天前
Unity——对RectTransform进行操作
ui·unity·c#·游戏引擎
AgilityBaby1 天前
FairyGUI和Unity联动(入门篇)
unity·游戏引擎