zoukankan      html  css  js  c++  java
  • Unity3D 5.x 交互功能

    1,给第一人称控制器添加脚本:playercollisions.js 脚本中只定义变量,先不添加方法:

    #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;
    private var currentdoor:GameObject;
     
    View Code

    2,给playercollisions.js中的变量指定对象:

      

    3,然后添加碰撞触发执行的方法:

    function OnControllerColliderHit(hit:ControllerColliderHit){ 
        if (hit.gameObject.tag=="playerDoor" && doorisopen==false) { 
            opendoor(hit.gameObject); 
        }
    }
     
        function opendoor(door:GameObject){ 
            doorisopen=true; 
            door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
            door.transform.parent.GetComponent(Animation).Play();
        }
    View Code

    4,确定碰撞对象已经添加Collider碰撞组件,规则物体(Cube)添加Box Collider,不规则物体添加Mesh Collider:

       

      我们给Door添加Box Collider并增大Size Y ,方便碰撞操作:

      

    5,处理碰撞的时候,可以借助 print((hit.gameObject); 查看当前碰撞的对象是什么

      是 Door 还是 OutPost:

      

    6,判断 hit.gameObject.tag=="playerDoor" 的时候,要保证大小写一致

      

    7,播放开门动画的时候,注意教程中outPost和自己项目中outPost的Animations的区别:

      教程中的动画进行了分割,而自己项目中的动画没有,所以我们只播放一次:

     door.transform.parent.GetComponent(Animation).Play();

      ------

    8,5.x版本中的播放方法:

    door.GetComponent(AudioSource).PlayOneShot(door_open_sound);

    9,碰撞开门,播放声音的JS代码,添加到第一人称后,即可实现碰撞开门、播放开门声音:

    #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;
    private var currentdoor:GameObject;
     
    
    function OnControllerColliderHit(hit:ControllerColliderHit){  
        print(hit.gameObject);
        if (hit.gameObject.tag=="playerDoor" && doorisopen==false) { 
            opendoor(hit.gameObject); 
        }
    } 
        function opendoor(door:GameObject){ 
            doorisopen=true; 
            door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
            door.transform.parent.GetComponent(Animation).Play();
        }
    View Code

     10,加入关门方法,3秒后再次播放动画:

    #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;
    private var currentdoor:GameObject;
    private var currentDoor:GameObject;
     
         function Start(){ 
        }
    
         function Update(){ 
         //如果门打开,开始计时  超过3秒后 再吃执行动画,并把开门时间重置为0
                 if(doorisopen==true){ 
                     doortimer+=Time.deltaTime; 
                           print(doortimer);
                    if(doortimer>door_open_time){
                        doortimer=0;
                        shutdoor(currentDoor); 
                    }
             }
        }
    
        //检测碰撞
    function OnControllerColliderHit(hit:ControllerColliderHit){  
        print(hit.gameObject);
        if (hit.gameObject.tag=="playerDoor" && doorisopen==false) { 
                currentDoor=hit.gameObject;
            opendoor(hit.gameObject);  
        }
    } 
    
       // //开门
        function opendoor(door:GameObject){ 
            doorisopen=true; 
            door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
            door.transform.parent.GetComponent(Animation).Play();
        }
        // 关门
       function shutdoor(door:GameObject){ 
            doorisopen=false;  
            door.GetComponent(AudioSource).PlayOneShot(door_shut_sound);
            door.transform.parent.GetComponent(Animation).Play();
        }
    View Code

    11,整合开门、关门方法:

    #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;
    private var currentdoor:GameObject;
    private var currentDoor:GameObject;
     
         function Start(){ 
        }
    
         function Update(){ 
         //如果门打开,开始计时  超过3秒后 再吃执行动画,并把开门时间重置为0
                 if(doorisopen==true){ 
                     doortimer+=Time.deltaTime; 
                           print(doortimer);
                    if(doortimer>door_open_time){
                        doortimer=0;
                        //shutdoor(currentDoor); 
                        door(currentDoor,false,door_shut_sound,"closedoor");
                    }
             }
        }
    
        //检测碰撞
    function OnControllerColliderHit(hit:ControllerColliderHit){  
        print(hit.gameObject);
        if (hit.gameObject.tag=="playerDoor" && doorisopen==false) { 
                currentDoor=hit.gameObject;
            //opendoor(hit.gameObject);  
            door(currentDoor,true,door_open_sound,"opendoor");
        }
    }   
    
       //对象,门的状态,播放的声音,播放的对象
        function door(thisDoor:GameObject,doorOpenOrClose:boolean,audio_clip:AudioClip,ani_name:String){ 
            doorisopen=doorOpenOrClose;
            thisDoor.GetComponent(AudioSource).PlayOneShot(audio_clip);
            thisDoor.transform.parent.GetComponent(Animation).Play(); //播放动画 区分开门和关门
        }
    View Code

      

  • 相关阅读:
    [bzoj2259][Oibh]新型计算机_Dijkstra
    [bzoj1660][Usaco2006 Nov]Bad Hair Day_单调栈
    [bzoj3943][Usaco2015 Feb]SuperBull_Kruskal
    [bzoj2131]免费的馅饼_树状数组
    [bzoj3932][CQOI2015]任务查询系统_主席树
    软件图标大全网站
    提示用户一直输入数字(默认为正整数),当用户输入end的时候显示当前输入数字中的最大值。
    打印多边形的菱形(for的嵌套)
    while循环问题(老师询问问题,学生回答。学生会了可以放学,或者老师讲了10遍,还是没有会的,被迫无奈也要放学。)
    while练习:输入一个班级的人数,然后依次输入学员成绩,计算班级学员的平均成绩和总成绩。
  • 原文地址:https://www.cnblogs.com/i-shanghai/p/5602892.html
Copyright © 2011-2022 走看看