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. 自己动手写一个简单的MVC框架(第二版)

    一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...

  2. c#语言-高阶函数

    介绍 如果说函数是程序中的基本模块,代码段,那高阶函数就是函数的高阶(级)版本,其基本定义如下: 函数自身接受一个或多个函数作为输入. 函数自身能输出一个函数,即函数生产函数. 满足其中一个条件就可以 ...

  3. MySQL HASH分区

    200 ? "200px" : this.width)!important;} --> 介绍 基于给定的分区个数,将数据分配到不同的分区,HASH分区只能针对整数进行HASH ...

  4. Javascript本质第一篇:核心概念

    很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理 ...

  5. js框架模版

    (function() { //注册命名空间zzw到window对象上 window['zzw'] = {} //定义一个$函数 function $() { alert("hello $& ...

  6. Android学习第一天-adb常用命令

    平时开发android应用 的时候,我们都会用到包含在Android SDK中一系列的工具,或许我们通过Eclipse去调用,又或许,我们自己通过打开终端进行手动输入并且执行,下面我们来一起学习下这些 ...

  7. 触摸java常量池

    java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下. 理论 小菜先拙劣的表达一下jvm虚拟内存分布:      程序计数器是jvm执行程序的 ...

  8. Dynamics CRM导出数据到Excel

    原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...

  9. Worktile协同特色之二:任务看板管理

    什么是看板 看板是一种使用可视化管理的方式,跟踪任务在整个价值流中流经的不同阶段,通常我们会用带贴纸的白板,或是电子卡片墙.具备如下几个特征:1. 流程可视化 把工作拆分成小块,一张卡片写一件任务,再 ...

  10. Oracle 中 union 和union all 的简单使用说明

    1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...