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.导入相关文件到数据 ...
随机推荐
- AnguarJS 第一天----Hello World
AngularJS是什么? AngularJS是目前很火的前端JS框架之一, AngularJS的开发团队将其描述为一种构建动态Web应用的结构化框架.它是完全使用JavaScript编写的客户端技术 ...
- 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...
- C#中使用Socket实现简单Web服务器
上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...
- HaProxy+Keepalived+Mycat高可用群集配置
概述 本章节主要介绍配置HaProxy+Keepalived高可用群集,Mycat的配置就不在这里做介绍,可以参考我前面写的几篇关于Mycat的文章. 部署图: 配置 HaProxy安装 181和1 ...
- Web3DGame之路(三)分析babylonjs
BabylonJS的例子十分详实 http://doc.babylonjs.com/tutorials Babylonjs的学习比较顺畅,开始做一些深入分析 一.语言选择 首先是js还是ts的问题 ...
- Windows Azure Storage (22) Azure Storage如何支持多级目录
<Windows Azure Platform 系列文章目录> 熟悉Azure平台的读者都知道,Azure Blob有三层架构.如下图:(注意blob.core.chinacloudapi ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- 初探nodeJS
一.node概要 对nodeJS早有耳闻,但是一直迟迟没有对它下手,哈哈哈,今儿咱就来初探一下它. nodeJS是个啥东东? nodeJS,我的理解就是可以运行在后端的JavaScript. 为什么它 ...
- MySQL学习笔记九:存储过程,存储函数,触发器
存储过程 1.存储过程由一组特定功能的SQL语句组成,对于大型应用程序优势较大,相对不使用存储过程,具有以下优点: a.性能提高,因为存储过程是预编译的,只需编译一次,以后调用就不须再编译 b.重用性 ...