• 关于Unity中的道具拾取(专题六)


    原理就是把道具做成触发器,触发器就是当我们有碰撞发生的时候,只会检测碰撞,而不会有任何改变物理运动状态的过程。

    触发器非常适合道具拾取,因为它不会改变原本运动物体的任何物理属性,但是依然会检测碰撞,响应物理事件。

    道具拾取实例

    1.创建Unity项目和文件目录,保存场景

    2.导入金币模型资源rc_fx_obj_04_mod.FBX和obj_04_tex.png,设置材质球的shader为Lagacy Shaders---->Diffuse,颜色设置为255,255,255,255

    3.创建一个平面Plane(拉长Z轴100倍)和一个胶囊体Capsule,创建一个空节点prop,把金币模型放在prop节点下作为子节点,如下图所示摆好各个节点的位置

    4.给金币节点prop添加一个矩形碰撞器组件Box Collider,点击Edit Collider,手动调整碰撞器的区域,之后勾选碰撞器组件的Is Trigger设置为触发器,注意两个物体之间必须有一个是刚体才会发生碰撞检测,所以给胶囊体Capsule添加Rigidbody组件,不使用重力

    5.编辑右上角的层,添加两个层,分别为player和prop,设置胶囊体Capsule为player层,节点prop为prop层

    6.打开物理引擎设置Edit---->Project Settings---->Physics,设置层的碰撞矩阵,只有player层和prop层会发生碰撞检测

    7.脚本方面,一般根据碰撞产生的结果而定,比如玩家碰到金币,金币的数值加到玩家节点上,所以玩家需要挂一个脚本来处理这个碰撞检测事件,而金币碰到玩家,删除自己,所以金币也需要挂载一个脚本来处理碰撞检测事件

    8.创建两个脚本prop和recv_prop,prop挂载在prop节点下,recv_prop挂载在胶囊体Capsule下

     打开prop.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class prop : MonoBehaviour {
    
        public int prop_type; // 道具的类型,不同的道具可以设置不同的类型
        // Use this for initialization
        void Start () {
            
        }
        
        // Update is called once per frame
        void Update () {
            
        }
    
        void OnTriggerEnter(Collider c)//这里的c指的都是撞我的节点,不是自己
        {
            Debug.Log("道具说:" + c.gameObject.name + c.gameObject.layer);
            if (c.gameObject.layer == 8)// 是player层的节点撞的我, 可以在这里写一些播放特效的代码
            {
                GameObject.Destroy(this.gameObject);
            }
        }
    }

    打开recv_prop.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class recv_prop : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
            
        }
        
        // Update is called once per frame
        void Update () {
            
        }
    
        void OnTriggerEnter(Collider c)//这里的c指的都是撞我的节点,不是自己
        {
            Debug.Log("玩家说:" + c.gameObject.name + c.gameObject.layer);
            if (c.gameObject.layer == 9)//是prop层的节点撞的我
            {
                prop p = c.GetComponent<prop>();//获得撞我的节点的prop组件
                switch(p.prop_type)//判断道具类型
                {
                    case 1:
                            Debug.Log("你捡到了金币!分数加1!");//不同的道具做不同的处理
                        break;
                }
            }
        }
    }

    9.再创建一个脚本控制胶囊体Capsule自己往Z轴正方向运动,挂载一个脚本move都节点Capsule下

    打开move.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class move : MonoBehaviour {
        private float speed = 5.0f;//移动的速度
        // Use this for initialization
        void Start () {
            
        }
        
        // Update is called once per frame
        void Update () {
            float s = this.speed * Time.deltaTime;//每秒移动的距离,单位米
            this.transform.Translate(0, 0, s);//移动
        }
    }

    10.运行结果

    总结
    (1) 做好道具,将道具的碰撞器设置为trigger模式,只检车碰撞,不改变运动
    (2) 玩家也加上碰撞器,玩家还要有一个刚体,否则没有办法触发碰撞;
    (3) 玩家和道具,进行分组,做好碰撞矩阵的设置;
    (4) 编写碰撞的响应函数,OnTriggerEnter(Collider c), OnTriggerExit, OnTriggerStay; 判断当前碰的是那个类型的物体,gameObjct.layer;
    (5) 每一个道具,都可以挂同一个脚本,然后,里面带上道具的类型;
    (6) 玩家拾取到道具,获得道具的类型,并处理我们的游戏逻辑;
    (7) 将道具,做成预制体,结合地图,或者是生成位置,在指定位置放置道具;

  • 相关阅读:
    (数论选拔)联盟阵容
    ai变成bi(递增)最小次数
    状压dp
    dp被3整除的子序列
    离散化+莫队
    dp+哈希
    set的应用
    NOIP 2016 明明的随机数
    洛谷背景更改
    zzulioj 1734 堆
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7308963.html
Copyright © 2020-2023  润新知