1,给第一人称控制器添加脚本:playercollisions.js 脚本中只定义变量,先不添加方法:

#pragma strict

var door_open_time:float=3.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip; private var doorisopen:boolean=false;
private var doortimer:float=0.0;
private var currentdoor:GameObject;

2,给playercollisions.js中的变量指定对象:

  

3,然后添加碰撞触发执行的方法:

function OnControllerColliderHit(hit:ControllerColliderHit){
if (hit.gameObject.tag=="playerDoor" && doorisopen==false) {
opendoor(hit.gameObject);
}
} function opendoor(door:GameObject){
doorisopen=true;
door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
door.transform.parent.GetComponent(Animation).Play();
}

4,确定碰撞对象已经添加Collider碰撞组件,规则物体(Cube)添加Box Collider,不规则物体添加Mesh Collider:

   

  我们给Door添加Box Collider并增大Size Y ,方便碰撞操作:

  

5,处理碰撞的时候,可以借助 print((hit.gameObject); 查看当前碰撞的对象是什么

  是 Door 还是 OutPost:

  

6,判断 hit.gameObject.tag=="playerDoor" 的时候,要保证大小写一致

  

7,播放开门动画的时候,注意教程中outPost和自己项目中outPost的Animations的区别:

  教程中的动画进行了分割,而自己项目中的动画没有,所以我们只播放一次:

 door.transform.parent.GetComponent(Animation).Play();

  ------

8,5.x版本中的播放方法:

door.GetComponent(AudioSource).PlayOneShot(door_open_sound);

9,碰撞开门,播放声音的JS代码,添加到第一人称后,即可实现碰撞开门、播放开门声音:

#pragma strict

var door_open_time:float=3.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip; private var doorisopen:boolean=false;
private var doortimer:float=0.0;
private var currentdoor:GameObject; function OnControllerColliderHit(hit:ControllerColliderHit){
print(hit.gameObject);
if (hit.gameObject.tag=="playerDoor" && doorisopen==false) {
opendoor(hit.gameObject);
}
}
function opendoor(door:GameObject){
doorisopen=true;
door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
door.transform.parent.GetComponent(Animation).Play();
}

10,加入关门方法,3秒后再次播放动画:

#pragma strict

var door_open_time:float=3.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip; private var doorisopen:boolean=false;
private var doortimer:float=0.0;
private var currentdoor:GameObject;
private var currentDoor:GameObject; function Start(){
} function Update(){
//如果门打开,开始计时 超过3秒后 再吃执行动画,并把开门时间重置为0
if(doorisopen==true){
doortimer+=Time.deltaTime;
print(doortimer);
if(doortimer>door_open_time){
doortimer=;
shutdoor(currentDoor);
}
}
} //检测碰撞
function OnControllerColliderHit(hit:ControllerColliderHit){
print(hit.gameObject);
if (hit.gameObject.tag=="playerDoor" && doorisopen==false) {
currentDoor=hit.gameObject;
opendoor(hit.gameObject);
}
} // //开门
function opendoor(door:GameObject){
doorisopen=true;
door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
door.transform.parent.GetComponent(Animation).Play();
}
// 关门
function shutdoor(door:GameObject){
doorisopen=false;
door.GetComponent(AudioSource).PlayOneShot(door_shut_sound);
door.transform.parent.GetComponent(Animation).Play();
}

11,整合开门、关门方法:

#pragma strict

var door_open_time:float=3.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip; private var doorisopen:boolean=false;
private var doortimer:float=0.0;
private var currentdoor:GameObject;
private var currentDoor:GameObject; function Start(){
} function Update(){
//如果门打开,开始计时 超过3秒后 再吃执行动画,并把开门时间重置为0
if(doorisopen==true){
doortimer+=Time.deltaTime;
print(doortimer);
if(doortimer>door_open_time){
doortimer=;
//shutdoor(currentDoor);
door(currentDoor,false,door_shut_sound,"closedoor");
}
}
} //检测碰撞
function OnControllerColliderHit(hit:ControllerColliderHit){
print(hit.gameObject);
if (hit.gameObject.tag=="playerDoor" && doorisopen==false) {
currentDoor=hit.gameObject;
//opendoor(hit.gameObject);
door(currentDoor,true,door_open_sound,"opendoor");
}
} //对象,门的状态,播放的声音,播放的对象
function door(thisDoor:GameObject,doorOpenOrClose:boolean,audio_clip:AudioClip,ani_name:String){
doorisopen=doorOpenOrClose;
thisDoor.GetComponent(AudioSource).PlayOneShot(audio_clip);
thisDoor.transform.parent.GetComponent(Animation).Play(); //播放动画 区分开门和关门
}

  

Unity3D 5.x 交互功能 - 碰撞检测函数的更多相关文章

  1. Unity3D 5.x 交互功能 - 光线投射、碰撞设置

    1,光线投射碰撞:第一人称视线在预置范围内(如3米)和看到的物体发生碰撞 ① 检测光线投射碰撞的脚本添加在第一人称FPSController上 #pragma strict private var c ...

  2. Unity3D事件顺序与功能

    Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. Awake 当 ...

  3. Unity3d与iOS交互开发——接入平台SDK必备技能

    原地址:http://www.2cto.com/kf/201401/273337.html# 前言废话:开发手机游戏都知道,你要接入各种平台的SDK.那就需要Unity3d与iOS中Objective ...

  4. Windows 10 IoT Serials 5 - 如何为树莓派应用程序添加语音识别与交互功能

    都说语音是人机交互的重要手段,虽然个人觉得在大庭广众之下,对着手机发号施令会显得有些尴尬.但是在资源受限的物联网应用场景下(无法外接鼠标键盘显示器),如果能够通过语音来控制设备,与设备进行交互,那还是 ...

  5. PHP中使用 $_GET 与$_POST 实现简单的前后台数据传输交互功能

    在之前的学习过程中我们接触过前后台数据请求交互的方法有表单提交.AJAX请求以及Angularjs中的$http,今天我们尝试在PHP中使用 $_GET 与$_POST 实现简单的前后台数据传输交互功 ...

  6. 为HTML表格添加交互功能------DataTables

    DataTables是一个功能强大的Javascript库,用于为HTML表格添加交互功能,虽然简单性是整个项目的核心设计原则,但入门看起来相当艰巨.但是,采取这些第一步并在您的网站上运行DataTa ...

  7. js用button激活 Alert 元素关闭按钮的交互功能

    js用button激活 Alert 元素关闭按钮的交互功能 一.总结 1.点(.)对应class,井号(#)对应id  2.jquery:amaze里面用的jquery,jquery熟悉之后,这些东西 ...

  8. C# 编写 Windows 动态桌面软件实现(一)之桌面交互功能

    DreamScene2 1.3 版本已经发布了,现在支持鼠标和桌面交互功能.这个功能不会影响性能,基本不占用 CPU.这个功能让我对 Windows 消息机制有了更深入的理解,在这篇博客中我会详细介绍 ...

  9. iOS开发之功能模块--高仿Boss直聘的IM界面交互功能

    本人公司项目属于社交类,高仿Boss直聘早期的版本,现在Boss直聘界面风格,交互风格都不如Boss直聘以前版本的好看. 本人通过iPhone模拟器和本人真机对聊,将完成的交互功能通过Mac截屏模拟器 ...

随机推荐

  1. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  2. php性能优化

    序   很长时间没有写博文了,最近换了工作,长时间加班,根本没有时间做其他事情!今天闲下来了,想一想php性能方面的事情.这也是我2014年的第一篇博文! 推荐阅读:初学者到中级者应该掌握的!   p ...

  3. xamarin UWP自定义圆角按钮

    uwp自带的button本身不支持圆角属性,所以要通过自定义控件实现. 通过设置Button的Background=“{x:Null}”设置为Null使背景为空,再设置Button.Content中的 ...

  4. Knockout中文开发指南(完整版API中文文档) 目录索引

    a, .tree li > span { padding: 4pt; border-radius: 4px; } .tree li a { color:#46cfb0; text-decorat ...

  5. Python 学习之路 (前言)

    为什么要学Python  1,脚本语言本身很方便简洁,未来会有趋势 2,web 方向 3,运维方向 我是学静态语言出身的,java,毕业后从事android 应用开发,曾在工作期间学习过linux,想 ...

  6. SSIS Execute SQL Task 用法

    Execute Sql Task组件是一个非常有用的Control Flow Task,可以直接执行SQL语句,例如,可以执行数据更新命令(update,delete,insert),也可以执行sel ...

  7. Sql Server系列:存储过程

    1 存储过程简介 存储过程是使用T-SQL代码编写的代码段.在存储过程中,可以声明变量.执行条件判断语句等其他编程功能.在MS SQL Server 2012中存储过程主要分三类:系统存储过程.自定义 ...

  8. 安装CentOS、Linux系统时,GPT分区不能引导的解决方法

    安装系统:CentOS 5.9_64bit时,分区后, 提示如下错误. 解决方法: 1.按ctrl+alt+F2 进入命令行 2.先查看分区 sh #fdisk -l    以下假设分区是/dev/s ...

  9. Android图片处理

    相信做Android开发的小伙伴对于Android图片压缩.裁剪一定有很深的印象,今天我将带领大家一起学习一下这个看着高深莫测的知识,以便再以后的学习.工作中可以帮助到大家. 首先我们看一下这个问题出 ...

  10. 有意思的Python:开发和部署一览

    我觉得在有时间的条件下,学习不同的开发语言,对于保持对技术的理解是有帮助的. Python是一门这样简单而且有趣的语言.网上资料已经比较多了.我这里主要对开发和部署环境所涉及的几个工具做些介绍. 1. ...