• 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

      

  • 相关阅读:
    [转]王垠的过去和现状
    支持向量机(SVM)基础
    C语言编程心得
    Fortran学习心得
    gdb使用心得
    大道至简第一章读后感
    第一个音符
    Exercise 1.20 最大公约数算法
    Exercise 1.19 Fast Fibonacci
    Exercise 1.16 1.17 1.18
  • 原文地址:https://www.cnblogs.com/i-shanghai/p/5618314.html
Copyright © 2020-2023  润新知