• 【Salvation】——怪物角色动画&主角碰撞死亡动画


    写在前面:这个动画功能同样也是使用JavaScript编写脚本,在Unity3D游戏引擎的环境中实现,在怪物的角色动画中,很多与人物相同,这里不再重复。


    一、设计敌人

    拖一个精英sprite到层次面板,把名字改为monster

    • 把敌人 10帧的动画 run 拖给敌人
    • 把动画控制脚本 animationController拖给敌人
    • 设置Frame Number:10     Direction:勾选,向左
    • 给敌人添加碰撞器  Box Collider  勾选IsTrigger
    • 调整碰撞器的大小   Size-X…Y…
    • 把敌人的标签 monster设置上
    • 在playerStateController脚本上添加功能代码→实现人物与怪物的碰撞检测,并在死亡后,按空格键实现场景的重新开始

    动画脚本:playerStateController

    //playerStateController(玩家状态控制功能)
    
    #pragma strict
    var idle:Texture;//引用图片
    var run:Texture;
    var jump:Texture;
    var die:Texture;
    var winTexture:Texture2D;
    var dieTexture:Texture2D;
    
    var gameState:GameState;//定义变量,标识玩家状态
    
    var levelName:String;//定义关卡名字的变量
    
    var soundName:AudioClip;//引用胜利声音
    var dieSound:AudioClip;//引用死亡声音
    
    private var myAnimation:animationController;//引用动画控制脚本(组件)
    
    private var moveDirection:boolean=true;//定义移动方向 boolean型
    private var exit:boolean=false;//定义出口 碰到出口,设置为true
    private var youWin:boolean=false;//是否取胜
    private var youDie:boolean=false;//是否死亡
    
    function Start () {
        youDie=false;
        myAnimation=GetComponent("animationController");//取得动画控制组件的   
                                                         控制(使用)权
    }
    
    function Update () {
            if(Input.GetAxis("Horizontal")>0){//按了D键,正移,向右走
                moveDirection=false;//设置移动方向的变量,向右,为false
                if(Input.GetButton("Jump")){//检测是否按下空格键
                 gameState=GameState.jumpRight;//按下了空格键,右跑跳
                }
                 else{gameState=GameState.runRight;//没按空格键,只向右跑
                }
                
            }else{
                    if(Input.GetAxis("Horizontal")<0){//按了A键,向左走
                        moveDirection=true;
                        if(Input.GetButton("Jump")){检测是否按了空格键
                        gameState=GameState.jumpLeft;//按了空格键,左跑跳
                      }else{
                      gameState=GameState.runLeft;//没按,只向左跑
                    }                
                        
            }else{//检测既没按A键,也没按D键的时候,按没按空格键
                if(Input.GetButton("Jump")){//按了空格键,跳
                    if(moveDirection){//检测当时的运动方向
                     gameState=GameState.idleLeftJump;//true,静止左跳
                  }else{gameState=GameState.idleRightJump;//false,静止右跳
                  }
                                
                }else{gameState=GameState.idle;}//没按空格键,静止状态
                        
                }
            }
        
                if(youDie){gameState=GameState.die;}
                                           //youDie为true,播放死亡动画    
    
        switch(gameState){//根据gameState的不同值,执行下面的语句
                case GameState.idle:
                    transform.renderer.material.SetTexture("_MainTex",idle);
                                                  //更换玩家图片为idle
                        myAnimation.frameNumber=1;//设置为静止的一帧图片
                        myAnimation.direction=false;//设置方向变量
                                                  //打勾为true,取消为false
                        break;//执行完这一块后跳出,后面的不执行了
    
                case GameState.runLeft:
                    transform.renderer.material.SetTexture("_MainTex",run);
                                                   //更换玩家图片为run
                        myAnimation.frameNumber=10;//设置为一序列的10帧图片
                        myAnimation.direction=true;//设置方向变量,向左跑
                        break;//跳出
    
                case GameState.runRight:
                    transform.renderer.material.SetTexture("_MainTex",run);
                        myAnimation.frameNumber=10;
                        myAnimation.direction=false;//设置方向变量,向右跑
                        break;
                        
                case GameState.jumpLeft:
                    transform.renderer.material.SetTexture("_MainTex",jump);
                        myAnimation.frameNumber=11;
                        myAnimation.direction=true;//设置方向变量,向左跳
                        break;
    
    
                case GameState.jumpRight:
                    transform.renderer.material.SetTexture("_MainTex",jump);
                        myAnimation.frameNumber=11;
                        myAnimation.direction=false;//设置方向变量,向右跳
                        break;    
                    
                case GameState.idleRightJump:
                    transform.renderer.material.SetTexture("_MainTex",jump);
                        myAnimation.frameNumber=11;
                        myAnimation.direction=false;//设置方向变量,静止右跳
                        break;    
        
                case GameState.idleLeftJump:
                    transform.renderer.material.SetTexture("_MainTex",jump);
                        myAnimation.frameNumber=11;
                        myAnimation.direction=true;//设置方向变量,静止左跳
                        break;        
                
                case GameState.celebrate:                                              
               transform.renderer.material.SetTexture("_MainTex",celebrate);
                        myAnimation.frameNumber=11;
                        myAnimation.direction=false;//设置方向变量,方向向右
                        myAnimation.lastFrameNo=8;//最后显示的图片是第8帧
                        break;                
                                        
                case GameState.die:
                    transform.renderer.material.SetTexture("_MainTex",die);
                        myAnimation.frameNumber=12;
                        myAnimation.direction=false;//设置方向变量,方向向右
                        myAnimation.lastFrameNo=11;//最后显示的图片是第11帧
                        break;                                                                                                                
            }
            
            if(Input.GetButton("Jump")&& youDie){//死亡
                  transform.position=new Vector3(0,-2,0);//重新设置玩家的位置
                  transform.collider.enabled=true;//打开玩家的碰撞器
                  youDie=false;//“已经死了”这个变量,设为false
                                 不再触发死亡这个状态
                    
            }
    
    }
    
    function OnTriggerEnter(other:Collider){//碰撞检测函数
        
            if(other.tag=="monster"){//检测玩家是否碰到了敌人
                youDie=true;//设置死亡为true
                AudioSource.PlayClipAtPoint(dieSound,Vector3(0,0,-10));
                            //播放一个死亡的声音
                yield WaitForSeconds(0.5);//演示0.5秒
                //transform.collider.enabled=false;//关闭玩家的碰撞器
            }
    }
    二、控制敌人左右循环移动

    创建MonsterController脚本→实现引用动画控制组件,显示怪物并镜像,限制怪物循环移动范围

    动画脚本:MonsterController

    //MonsterController(怪物移动控制功能)
    
    #pragma strict
    
    private var myanimationController:animationController;
    private var speed : float = 0.3f;//速度
    private var startPosition :float;//起始位置
    private var isDown:boolean = true;//起始允许移动
    
    function Start(){
        myanimationController = GetComponent.<animationController>();
        startPosition = transform.position.x;//取得怪物x方向的位置
     }
     
    
    function  Update(){
        if(isDown){
           transform.Translate(-speed*Time.deltaTime,0,0);//设置x轴移动,y轴不移动
        }else{
           transform.Translate(speed*Time.deltaTime,0,0);//设置x轴负方向移动,y轴方向不移动
    
        }
        if(transform.position.x-startPosition>0){isDown=true;myanimationController.direction=true;}
        if(transform.position.x-startPosition<-1.0){isDown=false;myanimationController.direction=false;}//控制移动距离
    }

    注:转载请注明出处

  • 相关阅读:
    EF的Join()和Include()差异性教程
    把sql server 2000的用户表的所有者改成dbo
    HTML5/CSS3开发工具
    原创:分享asp.net伪静态成目录形式iis如何设置
    WCDMA是什么意思?CDMA是什么意思?GSM是什么意思
    FlashDevelop快捷键
    android文章学习 侧滑菜单实现
    网页图片格式
    asp.net日志跟踪方法
    Zabbix分布式监控
  • 原文地址:https://www.cnblogs.com/ljq66/p/7772161.html
Copyright © 2020-2023  润新知