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;
}