Unity3D 5.x 交互功能 - 光线投射碰撞设置

Posted i-shanghai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 

 

  

以上是关于Unity3D 5.x 交互功能 - 光线投射碰撞设置的主要内容,如果未能解决你的问题,请参考以下文章

使用光线投射和实例化对象问题检查与多边形碰撞器的碰撞(统一)

Three.js 用于碰撞检测的光线投射

Unity3D:弹跳/反射光线投射

Hololens 2 的光线投射问题

Libgdx Box2d Raycast无法投射多条光线

unity获取raycast的XYZ