[Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。在研究了Unity3D Mecanim动画系统的重定向特性后,今天我们继续来探索Mecanim动画系统更多的特性吧。今天博主想和大家分享的是ACT游戏中的三连击效果的实现,由于Unity3D目前存在Animation和Animator两种类型的动画组件,因此本文将分别讲这两种类型的动画组件的三连击效果的实现,其中Animation组件是Unity3.5以下版本所使用的动画组件,Animator组件是目前Unity3D的Mecanim动画系统所使用的动画组件。
  我们首先来了解三连击效果的具体流程,假定角色当前处于Idle状态,此时玩家如果按下攻击键则进入Attack1状态,如果在规定的时间内,玩家继续按下攻击键则进入Attack2状态,否则返回到Idle状态;同理,如果角色处于Attack2状态,如果此时玩家按下攻击键则进入Attack3状态,否则返回Idle状态;当Attack3状态结束后,将返回到Idle状态,等待玩家触发下一次攻击。由此我们可以归纳出三连击的状态变化:
(1)Idle->Attack1->Idle
(2)Idle->Attack1->Attack2->Idle
(3)Idle->Attack1->Attack->Attack3->Idle
       通过状态变化情况我们可以考虑使用两种思路来实现三连击效果。第一种思路是,各状态动画相互独立,通过状态切换来实现整体的动画效果。第二种思路是,美工人员将各状态动画以序列形式,程序设计人员根据时间来控制动画效果。今天我们主要采用第一种方法,目的是领会游戏设计中的有限状态机思想,将其更好的应用到游戏开发中。好了,下面我们正式开始今天的内容吧!

一、Animator组件篇

Animator组件是Unity3D的Mecanim动画系统所使用的动画组件。这个组件通过Animator Controller来实现对动画的控制。如图是我们今天项目的主角,一个左手持盾,右手持剑的女战士。

我们首先来创建一个Animator Controller并将其命名为SwordGirlController,双击打开Animator窗口,按照我们对状态变化情况的讨论,我们可以很容易地设计出下面的状态模型:

在这里我们定义一个整型变量ActionID,其默认值为0。当ActionID的值为1时角色由Idle切换到Attack1,当ActionID的值为2时角色由Attack1切换到Attack2,当ActionID为3时角色由Attack2切换到Attack3。所有的指向Idle的连线的切换条件是ActionID的值为0。这样我们就建立了一个动画切换的状态模型。好了,下面我们来编写脚本实现对动画的控制:

//基于Mecanim动画系统的三连击效果,目前最大的问题就是玩家在攻击后无法
//自动恢复到Idle状态,需要执行一次攻击才可以回到Idle状态

using UnityEngine;
using System.Collections;

public class SwordGirlScript : MonoBehaviour {

	//Mecanim动画组件
	private Animator mAnimator=null;
	//动画状态信息
	private AnimatorStateInfo mStateInfo;
	//定义状态常量值,前面不要带层名啊,否则无法判断动画状态
	private const string IdleState="Idle";
	private const string Attack1State="Attack1";
	private const string Attack2State="Attack2";
	private const string Attack3State="Attack3";

	//定义玩家连击次数
	private int mHitCount=0;

	void Start ()
	{
		//获取动画组件
		mAnimator=GetComponent<Animator>();
		//获取状态信息
		mStateInfo=mAnimator.GetCurrentAnimatorStateInfo(0);
	}

	void Update ()
	{
	    //如果玩家处于攻击状态,且攻击已经完成,则返回到Idle状态
		if(!mStateInfo.IsName(IdleState) && mStateInfo.normalizedTime>1.0F)
		{
			mAnimator.SetInteger("ActionID",0);
			mHitCount=0;
		}
        //如果按下鼠标左键,则开始攻击
		if(Input.GetMouseButton(0))
		{
	        Attack();
		}
	}

	void Attack()
	{
	   //获取状态信息
	   mStateInfo=mAnimator.GetCurrentAnimatorStateInfo(0);
	   //如果玩家处于Idle状态且攻击次数为0,则玩家按照攻击招式1攻击,否则按照攻击招式2攻击,否则按照攻击招式3攻击
	   if(mStateInfo.IsName(IdleState) && mHitCount==0 && mStateInfo.normalizedTime>0.50F)
	   {
		  mAnimator.SetInteger("ActionID",1);
		  mHitCount=1;
	   }else if(mStateInfo.IsName(Attack1State) && mHitCount==1 && mStateInfo.normalizedTime>0.65F)
	   {
		  mAnimator.SetInteger("ActionID",2);
		  mHitCount=2;
	   }else if(mStateInfo.IsName(Attack2State)&& mHitCount==2 && mStateInfo.normalizedTime>0.70F)
	   {
		  mAnimator.SetInteger("ActionID",3);
	      mHitCount=3;
		}
	}
}

这样我们就可以实现ACT游戏中的三连击效果了,我们一起来看看最终的效果吧!

博主在实际测试的过程中发现角色在执行一次攻击后无法自动恢复到Idle状态,除非玩家继续按下攻击键,博主目前并没有找到解决的办法,如果各位朋友知道具体原因的话,一定要告诉博主啊,哈哈。

二、Animation组件篇

我们知道Mecanim动画系统是通过状态机来实现对动画的控制的,而在3.5版本以前的Unity3D所采用的动画系统呢,按照博主的理解,其实就是一种无状态的动画,我们只能通过动画片段的名称来决定播放某一个动画片段或者在一个确定的时间内进行动画的切换。因此,如果我们希望使用Animation组件来实现三连击效果的话,就必须在该组件的基础上实现一个状态机的结构。根据开始讨论的结果,我们知道整个三连击过程中有四个状态Attack1、Attack2、Attack3、Idle,由此我们可以定义一个动画状态的枚举类型ActionState。接下来我们就可以根据这个状态值来切换攻击动画,实现三连击的效果,我们一起来看脚本:

using UnityEngine;
using System.Collections;

public class AttackScripts : MonoBehaviour {

    //当前攻击动画;
    AnimationClip currentClip;
    //动画组件;
    Animation mAnimation;

    //动画状态枚举
    public enum ActionState
    {
        Attack1,
        Attack2,
        Attack3,
        None
    }

    //当前动画状态;
    private ActionState mState = ActionState.None;

    //攻击触发
    void AttackTrigger(){
        if (Input.GetMouseButton(0)){
            if (mState != ActionState.Attack1 && mState != ActionState.Attack2 && mState != ActionState.Attack3 ) {
                mState = ActionState.Attack1;
            }else if (mState == ActionState.Attack1 &&  mState != ActionState.Attack2 && mState != ActionState.Attack3
                && mAnimation[currentClip.name].time > 1.0F){
                mState = ActionState.Attack2;
            }else if (mState == ActionState.Attack2 &&  mState != ActionState.Attack1 && mState != ActionState.Attack3
                && mAnimation[currentClip.name].time > 1.0F){
                mState = ActionState.Attack2;
            }
        }
    }

    //攻击套路
    void Attacks (){
        float delayTime =0.0F;
        switch (mState){
            case ActionState.Attack1:
                delayTime = -0.1F;
                mAnimation.CrossFade("Attack1", 0.15F);
                currentClip = mAnimation["Attack1"].clip;
                break;

            case ActionState.Attack2:
                delayTime = -0.1f;
                mAnimation.CrossFade("Attack2", 0.15F);
                currentClip = mAnimation["Attack2"].clip;
                break;

            case ActionState.Attack3:
                delayTime = -0.1f;
                mAnimation.CrossFade("Attack3", 0.15F);
                currentClip = mAnimation["Attack3"].clip;
                break;

            case ActionState.None:
                break;
        }

        //如果攻击动画播放完就切换到Idle状态
        if (mAnimation[currentClip.name].time > (mAnimation[currentClip.name].length +delayTime)){
            mState = ActionState.None;
            currentClip = mAnimation["Idle"].clip;
        }
    }

    void Awake(){
        //获取动画组件;
        mAnimation = GetComponent<Animation>();
    }

    void Start () {
        if (mAnimation.clip) {
            currentClip = mAnimation.clip;
        } else {
            currentClip = mAnimation["Idle"].clip;
        }
    }

    void Update () {
        if (currentClip != null){
            AttackTrigger();
            Attacks();
        }
    }
}

这里的连击效果并没有设置打断,即所有的动画一次性播放完毕。如果我们在Mecanim动画系统中仅仅保留第三种情形,那么它实现的效果是一样的,这一点希望大家注意。好了,今天的内容就是这样了,感谢大家关注我的博客,希望大家能够喜欢。

[Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述,布布扣,bubuko.com

时间: 2024-08-02 02:51:31

[Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述的相关文章

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D游戏开发之从Unity3D到Eclipse

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本

Unity3D游戏开发之Unity3D动画与Mecanim动画系统

Unity3D游戏开发之Unity3D动画与Mecanim动画系统 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. Mecanim是Unity新增的动画系统,其功能强大而灵活,让人类和非人类角色栩栩如生.Mecanim的重定向极大的提供了工作效率,而且占用极少CPU周期.使用从Unity资源商店找到的动画资源,或

unity3D游戏开发之iTween介绍和用法

unity3D游戏开发之iTween介绍和用法 一.iTween 介绍 iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出.让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等 二.iTween 原理 iTween的核心是数值插值,简单说就是给iTween两个数值(开始值,结束值),它会自动生成一些中间值. 三.iTween 下载:  从官网http://itween.pixelplacement.com下载 主要文件有两个iTween.cs

Unity3D游戏开发之Unity打包APK

Unity3D游戏开发之Unity打包APK 1.安装JDK 2.配置JDK 3.在Paht的变量值后面加分号,把D:\android\adt-bundle-windows-x86-20131030\sdk\tools放在Path后面.[狗刨学习网] 4.点击菜单栏中的Edit-->Preferences 看Android SDK Location这个选项 浏览你的模拟器路径. 5.点击 File-Build Settings 然后再 点击Add Current 添加你的场景.再 点击Switc

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Unity3D游戏开发之3DMAX 灯光

Unity3D游戏开发之3DMAX 灯光 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一.3DMAX 五种光源 1.Ommi Light 泛光灯:可以从一点向四周均匀照射的点光源. 2.Target Spotlight 目标聚光灯:一种投射光束,影响光束内被照射的物体,可以投影 阴影,照射范围可以指定. 3.

iOS游戏开发之UIDynamic

iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象重力.弹性碰撞等现象 物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 知名的2D物理引擎 Box2d Chipmunk 使用步骤 要想使用UIDynamic来实现物理仿