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

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

道具拾取实例

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 == )// 是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 == )//是prop层的节点撞的我
{
prop p = c.GetComponent<prop>();//获得撞我的节点的prop组件
switch(p.prop_type)//判断道具类型
{
case :
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(, , s);//移动
}
}

10.运行结果

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

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

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

    鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是 ...

  2. 关于Unity中的3D拾取

    3D拾取 3D游戏实际上看到的是2D画面,我们在屏幕上点击,想要找到哪个3D物体,我们实际上是在一个2维平面内做3D拾取. 3D拾取实际上是,当玩家点击屏幕的时候,会从显示屏幕的摄像头发射一条射线,射 ...

  3. 从Unity中的Attribute到AOP(六)

    本文将重点对Unity剩下常用的Attribute进行讲解,其他不常用的Attribute各位可以自行去官方文档查阅. 首先是UnityEngine命名空间下的. ColorUsage,这个主要作用于 ...

  4. 关于Unity中ARPG游戏人物移动(专题十一)

    ARPG:动作型角色扮演类游戏 大多数的ARPG游戏都是使用摇杆操作,以第三人称摄像机的方式来跟随主角,实际上人物只走八个方向,上,下,左,右,左上,左下,右下,右上 控制角色移动的思路1: 在ARP ...

  5. NGUI研究之在Unity中使用贝塞尔曲线

    鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天由于工作的原因须要将贝塞尔曲线加在project中.那么我迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的随意角度的曲线,这两个点一 ...

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

    转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...

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

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

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

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  9. [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

随机推荐

  1. javascrip json2

    http://www.json.org/json-zh.html 下载: https://github.com/douglascrockford/JSON-js

  2. DatePicker的分割线颜色设置

    /** * * 设置时间选择器的分割线颜色 * @param datePicker */ private void setDatePickerDividerColor(DatePicker dateP ...

  3. MacOS Sierra10.12.4编译Android7.1.1源代码必须跳的坑

    简单介绍 下载Android7.1.1源代码花费了两天,编译整个源代码相同花费了2天,期间遇到无数个坑. 如今编译源代码,一旦中间遇到错误,则要又一次開始. 本文记录编译过程遇到的问题及解决方式,如有 ...

  4. C和指针第13章第4题

    题目:编写一个函数,它用于对一个任何类型的数组进行排序. 算法核心代码sort函数实现 /** 功能说明:sort函数可以对不同类型的数据进行排序 参数: 1.一个指向需要排序的数组的第一个值的指针. ...

  5. rsync 实现文件同步 (重要数据通过rsyncr把数据同步到不同的两台服务器上,这样可以防止服务器的硬盘故障导致数据丢失) 客户端同步时如果要排某个目录

    rsync是unix系统下的数据镜像 备份工具,一般linux系统都 自带: # rpm -qa|grep rsync rsync-3.0.9-17.el7.x86_64 服务器端:10.100.0. ...

  6. Splunk Web页面的登录密码忘记了怎么办

    splunk的web登录密码忘记的话,可以使用以下方法重置. 一.关闭splunk服务 /opt/splunk/bin/splunk stop 二.删除默认密码配置文件 三.重启启动splunk服务, ...

  7. 用户手势检测-GestureDetector使用详解

    一.概述 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等. 一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的o ...

  8. delphi 学习笔记的例子

    由于360改变了共享策略,导致之前的共享连接不能使用 重新共享了下. http://yunpan.cn/cgS2DBRT572jy (提取码:1eda)

  9. android下使用adb启动程序或者服务

    susetprop service.adb.tcp.prot 5555stop adbdstart adbdnetstat 使用 adb install hello.apk可以安装一个apk但并不能启 ...

  10. 如何调用Http请求的接口

    /// <summary> /// 发起一个HTTP请求(以POST方式) /// </summary> /// <param name="url"& ...