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