【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;}//控制移动距离
}


注:转载请注明出处

时间: 2024-08-06 16:09:20

【Salvation】——怪物角色动画&主角碰撞死亡动画的相关文章

CSS3之碰撞反弹动画无限运动

示例代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>CSS3 碰撞反弹动画无限运动</title> 6 <style type="text/css"> 7 .container { 8 width: 600px; 9 height: 400p

CoreAnimation4-隐式动画和显式动画

事务 Core Animation基于一个假设,说屏幕上的任何东西都可以(或者可能)做动画.动画并不需要你在Core Animation中手动打开,相反需要明确地关闭,否则他会一直存在. 当你改变CALayer的一个可做动画的属性,它并不能立刻在屏幕上体现出来.相反,它是从先前的值平滑过渡到新的值.这一切都是默认的行为,你不需要做额外的操作. 这看起来这太棒了,似乎不太真实,我们来用一个demo解释一下:首先和第一章“图层树”一样创建一个蓝色的方块,然后添加一个按钮,随机改变它的颜色.代码见清单

iOS Core Animation Advanced Techniques(四):隐式动画和显式动画

隐式动画 按照我的意思去做,而不是我说的. -- 埃德娜,辛普森 我们在第一部分讨论了Core Animation除了动画之外可以做到的任何事情.但是动画师Core Animation库一个非常显著的特性.这一章我们来看看它是怎么做到的.具体来说,我们先来讨论框架自动完成的隐式动画(除非你明确禁用了这个功能). 事务 Core Animation基于一个假设,说屏幕上的任何东西都可以(或者可能)做动画.动画并不需要你在Core Animation中手动打开,相反需要明确地关闭,否则他会一直存在.

动画编辑器和骨骼动画使用

动画编辑器 1.使用编辑器来创建编辑动画 (1)创建一个节点 (2)往节点里添加动画组件cc.Animation (3)编辑 动画剪辑器制作 AnimClip 动画剪辑就是一份动画的声明数据,我们将它挂在到Animation组件上 就能够将这份动画数据应用到节点上. (4)把动画剪辑设置到Animtion里面去 2.动画编辑器的使用 然后直接点击新建AnimaClip,并且保存好. 自动生成了可访问的动画列表.这个组件可以带多个这样的. 把它拖动到Default Clip就是 选择自动 播放或者

layaAir引擎制作游戏的图集动画、时间轴动画、和骨骼动画总结二

一.角色序列帧.ani动画的制作 1.在项目管理器中创建动画文件 2.创建动画模板,编辑动效名称 3.编辑序列帧动画 .ani格式动画的代码控制 1.动画加载loadAnmition() 2.播放与停止.动效模板切换 3.动画帧位置控制 4.动画播放完成事件 uui截图: Laya.init(1334, 750); Laya.loader.load(["res/comp.atlas","res/role.atlas"],Laya.Handler.create(thi

iOS动画开发之一——UIViewAnimation动画的使用

iOS动画开发之一--UIViewAnimation动画的使用 一.简介 一款APP的成功与否,除了完善的功能外,用户体验也占有极大的比重,动画的合理运用,可以很好的增强用户体验.iOS开发中,常用的动画处理有UIView动画编程和核心动画编程,其中UIView动画使用简便,开发中应用十分广泛.这篇博客,主要讨论UIView的动画使用. 二.UIView动画的几个方法 + (void)animateWithDuration:(NSTimeInterval)duration animations:

javascript动画效果之缓冲动画(修改版)

在编写多块同时触发运动的时候,发现一个BUG, timer = setInterval(show, 30);本来show是一个自定义函数,当设为timer = setInterval(show(one,two), 30);时,发现show里面的参数one和two无法被导入,所以需要做以下代码改进和优化 原版的html和css代码在这里javascript动画效果之缓冲动画 js代码如下 1 <script> 2 function $(id) { 3 return typeof id === &

Android动画--帧动画和补间动画

帧动画 首先我们定义在drawable文件夹下定义一个xml文件 里面包含我们要播放的动画的图片,以及每一帧动画的播放的时长 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@mi

android动画详解三 动画API概述

· 属性动画与view动画的不同之处 view动画系统提供了仅动画View 对象的能力,所以如果你想动画非View 对象,你就要自己实现代码. view动画系统实际上还被强制仅能对 View 的少数属性进行动画,比如缩放和旋转,而不能对背景色进行. view动画的另一个坏处是它仅修改View的绘制位置,而不是View的实际位置.例如,如果你动画一个移动穿越屏幕,button的绘制位置是正确的,但实际你可以点击它的位置却没有变,所以你必须去实现你自己的逻辑来处理它. 使用属性动画系统时,这个限制被