Unity3D 5.x 交互功能 - 光线投射、碰撞设置
1,光线投射碰撞:第一人称视线在预置范围内(如3米)和看到的物体发生碰撞
① 检测光线投射碰撞的脚本添加在第一人称FPSController上
#pragma strict
private var currentdoor:GameObject;
var hit:RaycastHit;
function Update(){ var fwd = transform.TransformDirection (Vector3.forward);
//当光线投射与任何碰撞器交叉时为真,否则为假
if(Physics.Raycast(transform.position,fwd,hit,18)){
//光线的碰撞物体
currentdoor=hit.collider.gameObject;
print(currentdoor);
if(currentdoor.tag=="playerDoor"){
print("collider");
currentdoor.SendMessage("doorcheck");
}
}
}
②控制Door开启的脚本添加在Door上,第一人称视线和门碰撞的时候通过SendMessage触发碰撞对象(Door)的开门方法:
#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; function Update(){
//如果门打开,开始计时 超过3秒后 再吃执行动画,并把开门时间重置为0
if(doorisopen==true){
doortimer+=Time.deltaTime;
print(doortimer);
if(doortimer>door_open_time){
doortimer=0;
//shutdoor(currentDoor);
door(false,door_shut_sound,"closedoor");
}
}
} function doorcheck(){
if(!doorisopen){
door(true,door_open_sound,"opendoor");
}
}
//执行的对象,门的状态,播放的声音,播放的对象
function door(doorOpenOrClose:boolean,audio_clip:AudioClip,ani_name:String){ doorisopen=doorOpenOrClose;
//thisDoor.GetComponent(AudioSource).PlayOneShot(audio_clip);
this.transform.parent.GetComponent(Animation).Play(); //播放动画 区分开门和关门
}
Tis: 如果光线投射没有发生碰撞,可以调节FPSController的高度或者跳起来试试。

2,transform,代表附加当前脚本的对象
3,给门添加 Box Collider 组件实现前进/后退到门附件的时候触发碰撞,第一人称进入门的Collider范围内即可发生碰撞。
①门上Box Collider的Is Trigger勾选
②适当设置BoxCollider的范围大小

③实时碰撞检测脚本,添加到门上
#pragma strict
function OnTriggerEnter(col:Collider){
if(col.gameObject.tag=="Player"){
transform.SendMessage("doorcheck");
}
}
④当第一人称进入BoxCollider的碰撞范围之内的时候,就可以触发开门脚本:doorcheck
门上的之前的一个脚本实现了开门:
#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; function Update(){
//如果门打开,开始计时 超过3秒后 再次执行动画,并把开门时间重置为0
if(doorisopen==true){
doortimer+=Time.deltaTime;
print(doortimer);
if(doortimer>door_open_time){
doortimer=0;
//shutdoor(currentDoor);
door(false,door_shut_sound,"closedoor");
}
}
} function doorcheck(){
print("doorcheck");
if(!doorisopen){
door(true,door_open_sound,"opendoor");
}
}
//执行的对象,门的状态,播放的声音,播放的对象
function door(doorOpenOrClose:boolean,audio_clip:AudioClip,ani_name:String){ doorisopen=doorOpenOrClose;
//thisDoor.GetComponent(AudioSource).PlayOneShot(audio_clip);
this.transform.parent.GetComponent(Animation).Play(); //播放动画 区分开门和关门
}
4,三种不同碰撞方法的简单应用:
①OnControllerColliderHit ,附加在第一人称控制器上
#pragma strict
import UnityEngine.UI;
//碰撞脚本添加在第一人称,第一人称和对象发射碰撞的时候触发
function OnControllerColliderHit(hit:ControllerColliderHit){
if(hit.gameObject.tag!="Plane"){
print(hit.gameObject.tag);
gameObject.Find("Canvas/Text").GetComponent(Text).text =hit.gameObject.tag;
}
}
②Physics.Raycast ,光线投射碰撞 脚本附加在第一人称控制器上 。当第一人称视线和物体碰撞的时候触发(游戏中瞄准动作):
#pragma strict
import UnityEngine.UI; private var objCollider:GameObject;
var hit:RaycastHit;
function Update(){ var fwd = transform.TransformDirection (Vector3.forward);
//当光线投射与任何碰撞器交叉时为真,否则为假
if(Physics.Raycast(transform.position,fwd,hit,)){
//光线的碰撞物体
objCollider=hit.collider.gameObject;
print(objCollider);
if(objCollider.tag!="Plane"){
gameObject.Find("Canvas/Text").GetComponent(Text).text =objCollider.tag;
}
}
}

③OnTriggerEnter , 加大Box Collider 的大小勾选Is Trigger,给物体添加脚本,实现进入物体碰撞范围即发生触发碰撞脚本(游戏中靠近门,开门效果):
#pragma strict
import UnityEngine.UI; //脚本附加到物体上,进入物体的碰撞范围之内就触发
function OnTriggerEnter(hit:Collider){
gameObject.Find("Canvas/Text").GetComponent(Text).text =hit.gameObject.tag;
}
Unity3D 5.x 交互功能 - 光线投射、碰撞设置的更多相关文章
- Unity3D 5.x 交互功能 - 碰撞检测函数
1,给第一人称控制器添加脚本:playercollisions.js 脚本中只定义变量,先不添加方法: #pragma strict var door_open_time:float=3.0; var ...
- Unity3D事件顺序与功能
Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. Awake 当 ...
- UNITY3D与iOS交互解决方案
原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 “授人以鱼,不如授人以渔”,以UNIT ...
- Windows 10 IoT Serials 5 - 如何为树莓派应用程序添加语音识别与交互功能
都说语音是人机交互的重要手段,虽然个人觉得在大庭广众之下,对着手机发号施令会显得有些尴尬.但是在资源受限的物联网应用场景下(无法外接鼠标键盘显示器),如果能够通过语音来控制设备,与设备进行交互,那还是 ...
- Photon Server与Unity3D客户端的交互
Photon Server与Unity3D的交互分为3篇博文实现 (1)Photon Server的服务器端配置 (2)Photon Server的Unity3D客户端配置 (3)Photon Ser ...
- C# 编写 Windows 动态桌面软件实现(一)之桌面交互功能
DreamScene2 1.3 版本已经发布了,现在支持鼠标和桌面交互功能.这个功能不会影响性能,基本不占用 CPU.这个功能让我对 Windows 消息机制有了更深入的理解,在这篇博客中我会详细介绍 ...
- Linux Shell 自动交互功能
需求背景: 近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大 ...
- iOS开发之功能模块--高仿Boss直聘的IM界面交互功能
本人公司项目属于社交类,高仿Boss直聘早期的版本,现在Boss直聘界面风格,交互风格都不如Boss直聘以前版本的好看. 本人通过iPhone模拟器和本人真机对聊,将完成的交互功能通过Mac截屏模拟器 ...
- 打开phpmyadmin显示高级功能尚未完全设置部分功能未激活
问题:老师,打开phpmyadmin显示高级功能尚未完全设置部分功能未激活,应该如何解决? 这是前一阵子学生问过我的一个问题,今天我就在博客里解答你的疑问吧. 总共三步可以搞定 1.导入相关文件到数据 ...
随机推荐
- Linux 查找已安装软件的方法
1.rpm 注意rpm区分大小写 查询已安装的以mysql开头的包 rpm -qa mysql* 查询已安装的mysql 包 rpm -qa|grep mysql rpm的方法有时候也所有已安装的包 ...
- 基于Quick-cocos2d-x的资源更新方案 一
图片来自网络 思绪何来 昨天写了一篇关于更新方案的理论 游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游) 今天继续细化一下 由于新项目采用的是Quick-cocos2d-x,那我就直接给出我 ...
- PMO是什么?如何与其他部门协作配合提高项目成功率?
许多公司里,有许多IT项目,特别是在软件公司里,许多开发团队并没有运用灵敏开发来进行项目办理.在某些状况下,尤其在一些公司里IT不是很受注重的,只能作为一个事务支撑部分,灵敏团队面对的首要疑问,是缺少 ...
- 关于CefSharp的坎坷之路
项目背景: 公司的XX产品需要升级和以后支持多平台的使用.因为之前项目是由WPF实现的.目前以后想作为Html5来展示页面. 因为涉及到整体更改遇到的问题较多以及其他原因,所以只是内部内容区域先替换为 ...
- 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)
小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...
- CSS学习笔记2-2d变换和过渡属性
前言:今天又是一个周末,心情不错,趁着闲暇之余,把剩下来的CSS3学习的内容全部整理出来,练习用的源码也稍微整理了一下. 2D转换 transform:translate||rotate||scale ...
- ES6学习记录
前言 由于要学习React Native ,所以得用到ES6,故为运用React Native做一个铺垫 学习记录 一.变量 1.let let 与 var 作用相同,用于定义变量,但是作用域不同.不 ...
- SQL Server 2014新特性探秘(1)-内存数据库
简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQL PASS Summit 2012的开幕式时,微软就宣布 ...
- jquery插件编写模版
jquery插件是什么??这里以讨论实力方法为主,比如 $("div").pluginname({}); 他的最简单形势应该是 $.prototype.plugin = funct ...
- 解读sencha touch移动框架的核心架构(二)
本来这行要详解Ext.extend的,但是发现网站有很详细的,那么就跳过去吧 为保持一个系列的分析,还是先搬过来吧,下章开始分析Ext4.0的新架构 在Java中,我们在实现继承的时候存在下面几个事实 ...