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,可以研究一下。

相关推荐
霸王•吕布14 分钟前
游戏引擎中的粒子系统
游戏引擎·粒子系统·粒子发射盒·粒子物理参数·粒子实例·粒子生命周期·粒子参数
小徐小徐编程不急9 小时前
unity实现背包拖拽排序
unity·游戏引擎
萘柰奈14 小时前
Unity进阶--C#补充知识点--【Unity跨平台的原理】Mono与IL2CPP
unity·c#·游戏引擎
淡海水15 小时前
【原理】Unity GC 对比 C# GC
unity·c#·gc·垃圾回收
阿赵3D17 小时前
Unity引擎播放HLS自适应码率流媒体视频
unity·游戏引擎·音视频·流媒体·hls
NRatel20 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
郝学胜-神的一滴21 小时前
Three.js 材质系统深度解析
javascript·3d·游戏引擎·webgl·材质
SmalBox1 天前
【渲染流水线】[光栅阶段]-[片元着色]以UnityURP为例
unity·渲染
★YUI★2 天前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
SmalBox2 天前
【渲染流水线】[光栅阶段]-[光栅插值]以UnityURP为例
unity·渲染