关于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) 将道具,做成预制体,结合地图,或者是生成位置,在指定位置放置道具;

时间: 2024-08-01 22:39:42

关于Unity中的道具拾取(专题六)的相关文章

NGUI研究院之在Unity中使用贝塞尔曲线(六)[转]

鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是起点,一个是终点.在这条曲线之上还会有两个可以任意移动的点来控制贝塞尔曲线的角度.如下图所示,点1 和点4 就是起点和终点,点2 和点3 就是控制曲线角度的两个动态点. 如下图所示.使用拖动条来让曲线发生旋转,大家会看的更加清晰.目前我们看到的被塞尔曲线是在平面中完成的,其实贝塞尔曲线是完全支持3D

关于Unity中的3D拾取

3D拾取 3D游戏实际上看到的是2D画面,我们在屏幕上点击,想要找到哪个3D物体,我们实际上是在一个2维平面内做3D拾取. 3D拾取实际上是,当玩家点击屏幕的时候,会从显示屏幕的摄像头发射一条射线,射到它所照射的平面上,射线第一次碰撞到的物体就是玩家所选的物体. 1: 游戏中需要用户触摸/点击 操作3D世界里面的3D物体,那么需要判断用户点击的是3D中的哪个物体;2: 3D拾取的原理: 从摄像机到屏幕空间的触摸点发出一条射线,这条射线第一个撞到哪个3D物体就会认为哪个3D物体被用户选择;3: 代

Unity热更新专题(六)uLua简介

Unity热更新专题(六)uLua简介 Unity热更新的解决方案中,uLua无疑是比较好的一种. 所以我们先来介绍一下uLua. 之前文章提到的Lua以及LuaInterface的学习,都是为了学习uLua来做基础的. 关于uLua的学习,我们可以参考官网,以及官方bbs来学习.上面有详细的视频文字教程. 官网:http://www.ulua.org/index.html 官方bbs:http://bbs.ulua.org/ 学习uLua有以上资料就够了. ==================

【Unity技巧】Unity中的优化技术

写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Unity Cookie中的一个教程.还有很多其他参考在下面的链接中. 这篇文章旨在简要地说明一下常见的各种优化策略.不过对每个基础有非常深入地讲解,需要的童鞋可以自行去相关资料. 还有一些我认为非常好的参考文章: Performance Optimization for Mobile Devices

(转)【Unity技巧】Unity中的优化技术

写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Unity Cookie中的一个教程.还有很多其他参考在下面的链接中. 这篇文章旨在简要地说明一下常见的各种优化策略.不过对每个基础有非常深入地讲解,需要的童鞋可以自行去相关资料. 还有一些我认为非常好的参考文章: Performance Optimization for Mobile Devices

开发指南专题六:JEECG微云快速开发平台代码生成

开发指南专题六:JEECG微云快速开发平台代码生 1.1. 代码生成扫描路径配置 用代码生成器生成代码后,需要进行相关配置配置,扫描注入control.service.entity等; 详细操作步骤如下: 1. control扫描配置,在spring-mvc.xml文件里面 2. Service扫描路径配置, spring-mvc-hibernate.xml 3. 实体Entity扫描路径配置, spring-mvc-hibernate.xml 1.2. 功能测试 1.2.1. 添加菜单并授权

解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

在上一个样例中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上. 这篇文章将要在此基础上研究片段的擦除(discarding fragments)和前面剪裁.后面剪裁(front face culling and back face culling)来达到透明效果. 当一个mesh组件的信息被传递后,我们能够通过代码决定哪些部分渲染(render)出来.而哪些部分不要.这个过程就像把那些不要的部分剔除了,我们看不到他.尽管他的mesh信息还在.可是我们的G

解读Unity中的CG编写Shader系列三

转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章将要在此基础上研究片段的擦除(discarding fragments)和前面剪裁.后面剪裁(front face culling and back face culling)来达到透明效果. 当一个mesh组件的信息被传递后,我们可以通过代码决定哪些部分渲染(render)出来,而哪些部分不要,这

Unity教程之再谈Unity中的优化技术

这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点处理“一项.这里的几何体就是指组成场景中对象的网格结构. 3D游戏制作都由模型制作开始.而在建模时,有一条我们需要记住:尽可能减少模型中三角形的数目,一些对于模型没有影响.或是肉眼非常难察觉到区别的顶点都要尽可能去掉.例如在下面左图中,正方体内部很多顶点都是不需要的,而把这个模型导入到Unity里就会是