zoukankan      html  css  js  c++  java
  • Unity3D屠龙战机项目总结

      

      之前跟着老师后面边学边做了一个屠龙战机项目,在这个项目中,主要用到的技术,在这里总结一下(本次项目的脚本语言用的是JS):

    1、  如果想在场景中导入一个声音文件,则需要在脚本中添加一个变量,如在脚本顶部添加:var menusound:AudioClip;在JS中,默认的变量是public,所以将脚本文件添加到对象后,会有sound这个选项,然后将所需要的文件拖到这里。

    2、创建一个按钮,先定义一个变量,用于说明按钮的位置

     private var newGanePosition:Rect=new Rect(10,10,10);

           同样添加一个变量,用于接收按钮的皮肤:

    var myskin:GUISkin;

           然后在OnGUI事件中创建按钮:   

    function OnGUI(){
    
                         GUI.Skin=mySkin;
    
                         GUI.Button(newGamePosition,””,GUI.Skin.GetStyle(“newGameButton”));
    
    }
    

       如果想通过点击按钮,发生事件,如进入下一个场景,则需要将上面的函数改为:

    function OnGUI(){
                  GUI.Skin=mySkin;
    
                  if(GUI.Button(newGamePosition,””,GUI.Skin.GetStyle(“newGameButton”))){
                         //DoSomething
            }
    }

    3、如果想在点击一个按钮,让它播放按钮声音后再进入其他场景,则需要添加一个时间推迟脚本

    function waitSeconds(){
    
            yield WaitTimesForSecond(menusound.length);  
    
            Application.LoadLevel(1);     //1是场景的顺序,从0开始计数
    
    }
    

      

    4、如果想在游戏的主界面添加一个背景音乐,并且让它一直播放,不会因为进入其它场景而终止,则添加一个脚本:

           

    function Awake(){      //Awake的执行顺序第一,其次是Start
    
                  DontDestroyOnLoad(transform.gameObject);
    
    }
    

      

    5、如果想使一个物体一直向下运动,可以通过Update函数实现:

                 

     var speed:float=1;
     function Update(){
    transform.translate(Vector3.down*speed*Time.deltaTime); }

      

          

    6、碰撞检测的条件:对于双方需要检测碰撞的物体,至少其中一个必须是刚体,如果该刚体是运动的,那么在双方都没有设置碰撞题的isTrigger属性的时候,双方都可以通过OnCollisionEnter代码检测碰撞;如果至少一个碰撞体isTrigger被设置,则双方都可以通过OnTriggerEnter代码检测碰撞。

                  

    function OnTriggerEnter(other:Collider){
    
                         //DoSomething
    
    }
    
    function OnCollisionEnter(other:Collision){
    
           //DoSomething
    
    }
    

      

    7、对于一组动画,就我所知可以通过在3D max或maya中做好的模型导入,也可以在Unity3D中做,当然对于爆炸的特效,可以通过一组动作图片,然后通过函数显示出来,在此次项目中,添加了一个aniSprite脚本文件:        

    //以下的变量值都可以在unity中设置,根据具体情况而定
    
                  var isUsed=false;
    
                  var timeLength:float=0;        //动画的时间长度
    
                  var columnSize:int=1;     //图片中的总列数
    
                  var rowSize:int=1;                //图片中的总行数
    
                  var colFrameStart:int=0;
    
                  var totalFrames:int=0;           //动画的总帧数
    
                  var framePerSeconds:int=0;   //每秒播放的帧数
    
                  var totalTime:float=1.0;        //动画的总时间
    
                 
    
                  private var index:int=0;
    
                  private var myTime:float=0;
    
                  private var size:Vector2;        //一般是用Vector3,此次项目是2D游戏
    
                  private var offset:Vector2;     //偏移量
    
                  private var myTimeLength:float=0;
    
                  private var isPlay=true;         //设置动画是否播放
    
                  private var myTimeLength:float=0;
    
     
    
                  function Update(){
    
                         if(isUsed){
    
                                            isUsed=aniSprite(columnSize,rowSize,colFrameStart,rowFrameStart,totalFrames,framePerSeconds,totalTime);
    
                                myTimeLength+=Time.deltaTime;
    
                                if(timeLength!=0 && myTimeLength>timeLength)
    
                                       Destroy(gameObject);
    
    }
    
    }
    
     
    
    function aniSprite(columnSize:int,rowSize:int,colFrameStart:int,rowFrameStart:int,totalFrames:int,framesPerSeconds:int,totalTime:float){
    
                  myTIme+=Time.delatTime;
    
                  if(myTime>totalTime && totalTime!=0){
    
                         isPlay=false;
    
                         myTime=0;
    
                         return isPlay;
    
    }
    
    index=myTime*(framesPerSeconds-1);
    
    index=index%totalFrames;
    
     
    
    var v:int=index%rowSize;
    
    var u:int=index%columnSize;
    
     
    
    size=new Vector2(1.0/columnSize,1.0/rowSIze);
    
    offset=new Vector2((u+colFrameStart)*size.x,1.0-size.y-(v+rowFrameStart)*size.y);
    
    renderer.material.mainTextureScale=size;
    
    renderer.material.mainTextureOffset=offset;
    
    return ture;
    
    }                
    

      

          

    8、实例化爆炸对象      

    var explosion:GameObject;
    
    Instantiate(explosion,transform.position,transform.rotation);
    

      

    9、对于指定发生碰撞的对象,可以对该对象添加一个tag属性    

    Function OnTriggerEnter(other:collider){   
    
        if(other.transform.tag==”enemy”){
    
           Destroy(other.gameObject);     //销毁其它对象
    
        }
    }
    

      

    10、更换对象材质的方法     

    var blockhouse:Material;
    
    transform.renderer.material=blockHouse;
    

      

    11、使物体失去碰撞体功能  

     transform.collider.eabled=false;
    

      

    12、在游戏中,一般都会用代码操作敌人自动攻击玩家,而这里就需要判断玩家的位置,根据敌人和玩家的相对位置,来攻击玩家。在屠龙战机项目中,也用到了这个功能,具体代码实现如下:  

    var sound:AudioClip;                          //敌人死后的声音
    
    var yellowProjectile:GameObject;        //敌人的子弹
    
    var playerTransform:Transform;          //玩家对象
    
     
    
    private var shoot:Boolean=false;          //设置敌人是否射击玩家
    
    private var myTime:float=0.0;             //敌人射击玩家的间隔时间
    
    private var angle:float=0.0;                 //敌人和玩家之间的角度
    
     
    
    function Update(){
    
      if(transform.position.y-playerTransform.y)<0){
    
           shoot=false;                  //如果玩家的位置已经飞过敌人的位置,在敌人上面
    
      }
    
      angle=Mathf.Rad2Deg*Math.Atan((transform.position.y-playerTransform.position.y)/(transform.position.x-playerTransform.position.x));
    
      if(shoot && transform.position.y<2.5){
    
           if(angle<0){
    
           angle=90-Mathf.Abs(angle);
    
      }else{
    
           angle=-90+Mathf.Abs(angle);
    
      }
    
      transform.LocalEulerAngles=new Vector(0,0,angle);
    
      Instantiate(yellowProjectile,transform.position,transform.rotation);
    
      AudioSource.PlayClipAtPoint(sound,new Vecor3(0,0,-10));    //这里是摄像机的位置
    
      myTime=0;
    
      shoot=false;
    
      }
    
      myTime+=deltaTime;
    
      if(myTime>2){
    
           shoot=true;
    
      }
    }
    

      

    13、游戏中操作玩家的位置的重要的,Unity3D中,如果想将对象的位置设置为随鼠标移动而改变    

    function Update(){
    
                  transform.position=Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,Input.mousePosition.z));
    
    }
    

      

    14、改变刚体速度,要用到Rigidbody.Velocity这个属性       

    var projectile:Rigidbody;
    
    var myProjectile:Ridigbody=Instantiate(projectile,transform.position,transform.rotation);
    
    myProjectile.Velocity=transform.TransformDirection(new Vector3(0,-2,0);
    

      

    15、实现血条

           其实血条的实现就是通过代码,改变血条材料的长短,当血条的长度为零时,就结束游戏。改变血条的长短,就是改变x轴值,y轴和z轴的值不需要改变。比如在此次游戏中:

           

    function Update()
    {
          if(GameState.myCount<=20)      //这里的GameState相当于一个静态类,myCount是它的静态成员
        {
            transform.localScale=new Vector3(0.72*(1-GameState.myCount/20),5,1);
    
          }
    }                
    
  • 相关阅读:
    python查询MySQL写入Excel
    Spring BOOT的学习笔记
    后台管理系统好用的UI框架
    SSM学习笔记
    解决thinkPHP3.2.3使用Smarty模板后无法使用系统常量问题
    提交代码,SVN被锁定,提示:svn is already locked解决方案
    CentOS 7编译安装php7.0.7以及可能遇到的问题的解决方案
    thinkphp nginx配置
    php读取不到指定的php.ini配置
    phpmyadmin nginx设置
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3216948.html
Copyright © 2011-2022 走看看