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"); 
        } 
    } 
}
View Code

  ②控制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(); //播放動畫 區分開門和關門
    } 
View Code

   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"); 
    }
}
View Code

  ④當第一人稱進入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(); //播放動畫 區分開門和關門
    } 
View Code

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

  ②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; 
        } 
    } 
}
View Code

  

  ③OnTriggerEnter , 加大Box Collider 的大小勾選Is Trigger,給物體添加腳本,實現進入物體碰撞范圍即發生觸發碰撞腳本(游戲中靠近門,開門效果):

#pragma strict 
import UnityEngine.UI; 

//腳本附加到物體上,進入物體的碰撞范圍之內就觸發
function OnTriggerEnter(hit:Collider){   
  gameObject.Find("Canvas/Text").GetComponent(Text).text =hit.gameObject.tag; 
} 
View Code

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM