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,15)){ //光线的碰撞物体 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; }