我想了解下unity3d 特效游戏中的特效是怎么实现的

& & & & 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是。在研究了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组件是的动画系统所使用的动画组件。这个组件通过来实现对动画的控制。如图是我们今天项目的主角,一个左手持盾,右手持剑的女战士。& & 我们首先来创建一个并将其命名为,双击打开窗体,依照我们对状态变化情况的讨论,我们能够非常easy地设计出以下的状态模型:& & 在这里我们定义一个整型变量,其默认值为。当的值为时角色由切换到,当的值为时角色由切换到,当为时角色由切换到。全部的指向的连线的切换条件是的值为。这样我们就建立了一个动画切换的状态模型。好了,以下我们来编写脚本实现对动画的控制://基于Mecanim动画系统的三连击效果,眼下最大的问题就是玩家在攻击后无法
//自己主动恢复到Idle状态,须要运行一次攻击才干够回到Idle状态
using UnityE
using System.C
public class SwordGirlScript : MonoBehaviour {
//Mecanim动画组件
private Animator mAnimator=
//动画状态信息
private AnimatorStateInfo mStateI
//定义状态常量值,前面不要带层名啊,否则无法推断动画状态
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))
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;
}& & & 这样我们就能够实现游戏中的三连击效果了,我们一起来看看终于的效果吧!& &博主在实际測试的过程中发现角色在运行一次攻击后无法自己主动恢复到状态,除非玩家继续按下攻击键,博主眼下并没有找到解决的办法,假设各位朋友知道详细原因的话,一定要告诉博主啊,哈哈。& & & & 二、Animation组件篇& & & & 我们知道动画系统是通过状态机来实现对动画的控制的,而在版本号曾经的所採用的动画系统呢,依照博主的理解,事实上就是一种无状态的动画,我们只能通过动画片段的名称来决定播放某一个动画片段或者在一个确定的时间内进行动画的切换。因此,假设我们希望使用组件来实现三连击效果的话,就必须在该组件的基础上实现一个状态机的结构。依据開始讨论的结果,我们知道整个三连击过程中有四个状态、、、,由此我们能够定义一个动画状态的枚举类型using UnityE
using System.C
public class AttackScripts : MonoBehaviour {
//当前攻击动画;
AnimationClip currentC
//动画组件;
Animation mA
//动画状态枚举
public enum ActionState
//当前动画状态;
private ActionState mState = ActionState.N
//攻击触发
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&].
case ActionState.Attack2:
delayTime = -0.1f;
mAnimation.CrossFade(&Attack2&, 0.15F);
currentClip = mAnimation[&Attack2&].
case ActionState.Attack3:
delayTime = -0.1f;
mAnimation.CrossFade(&Attack3&, 0.15F);
currentClip = mAnimation[&Attack3&].
case ActionState.None:
//假设攻击动画播放完就切换到Idle状态
if (mAnimation[currentClip.name].time & (mAnimation[currentClip.name].length +delayTime)){
mState = ActionState.N
currentClip = mAnimation[&Idle&].
void Awake(){
//获取动画组件;
mAnimation = GetComponent&Animation&();
void Start () {
if (mAnimation.clip) {
currentClip = mAnimation.
currentClip = mAnimation[&Idle&].
void Update () {
if (currentClip != null){
AttackTrigger();
Attacks();
}& & & &这里的连击效果并没有设置打断,即全部的动画一次性播放完毕。假设我们在动画系统中只保留第三种情形,那么它实现的效果是一样的,这一点希望大家注意。好了,今天的内容就是这样了,感谢大家关注我的博客,希望大家能够喜欢。每日箴言:无论当下的我们有没有人爱,我们都要努力做一个可爱的人。不埋怨谁,不嘲笑谁,也不羡慕谁,做自己的梦,走自己的路。喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei。转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/
阅读(...) 评论()& & & &&大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是。& & & & 我实在不明确有的人为什么不喜欢武侠/仙侠类游戏,也许是因为武侠/仙侠类游戏身上被永远烙上的国产标签吧!博主近期在玩一部叫做《雨血》的游戏,博主不禁感慨:在这样一个流星蝴蝶不再闪烁、网游成风、国产双剑兴许创新不足的后国产时代,竟然还能够有这样一部再次让博主热血沸腾的游戏。博主最早接触过的游戏是《流星蝴蝶剑》,因为这部游戏的上手难度本身非常高,所以博主基本上没有通关过,如今偶尔拿出来一个人怀念一下。据说《雨血》系列堪称第一部走出国门的国产RPG,博主一直有一个梦想,就是有一天我们能够用RPG来演绎中国古代最为绚丽夺目的文学经典《西游记》。博主是一个相对传统的人,喜欢中国的传统文化,所以对于国外的文化找不到一种归属感,我实在没有认为国外游戏中的魔法会比中国的仙术、武功、五行、暗器、蛊术来得简单。假设说仙剑、古剑是仙侠背景下的武侠,轩辕剑是历史背景下的武侠,那么《血雨》就是古龙武侠风格下的武侠。博主非常喜欢这种画风,因为每个画面都让人认为这是在赞赏一件艺术品,我们来看几张图片吧:& & & & &能够看到,在这部游戏中,前两部是半即时制RPG,第三部则全然是即时制RPG。博主尤其喜欢这部游戏的配乐,整个配乐大气磅礴,一招一式都有不错的打击感,并且武器的特效十分华丽。那么,到这里,就到了我们今天的主题:刀光剑影特效的制作。我们今天选择的PacketRPG插件,这个插件能够帮助我们高速地实现武器拖尾特效。好,以下我们開始:& & & & &首先我们打开Unity3D、导入PocketRPG Trails。使用这个插件,我们首先要做的是须要和美工交流,以获得模型中武器的确切位置。假设不知道武器的确切位置,建议大家还是和博主一样使用这个插件自带的模型吧。好,首先我们在项目中找到这个模型:& & & &以下我们将模型拖到场景中,展开模型,发现以下的结构:& & & & &我们展开到left_hand_joint这是左手的关节,能够发现它的以下有两个节点,第一个是手指,第二个我们将其改名为Left_Weapon,这就是我们左手武器的位置,我们在它的以下创建一个LeftWeaponTrail,这是用来显示我们特效的组件,我们为其加入WeaponTrail脚本:& & & & 完毕该脚本的加入后,我们为其加入Mesh Renderer,选择特效材质,这里我们选择PocketRPG提供的默认材质:& & & & 相同地,对于右手,我们採取相同的方法找到节点,为其加入特效组件,这里命名为RightWeaponTrail。接下来,我们将模型结构临时合并到一起,我们选中真个模型,为其加入AnimationController脚本,这是PocketRPG提供的用于控制模型动画的一个脚本。好了,做好前面的基础后,我们来编写脚本,控制我们的角色:using UnityE
using System.C
public class ChangeAnim : MonoBehaviour {
//定义左手WeaponTrail
public WeaponTrail mWeapTrailL;
//定义右手WeaponTrail
public WeaponTrail mWeapTrailR;
//定义攻击招式1
private AnimationState State_Attack1;
//定义攻击招式2
private AnimationState State_Attack2;
//定义攻击招式3
private AnimationState State_Attack3;
//定义攻击招式4
private AnimationState State_Attack4;
//定义等待状态
private AnimationState State_W
//动画控制器
private AnimationController mC
void Start ()
//获取动画控制器
mController=gameObject.GetComponent&AnimationController&();
//为每个招式设定相应的动画
State_Attack1=animation[&Attack1&];
State_Attack2=animation[&Attack2&];
State_Attack3=animation[&Whirlwind&];
State_Attack4=animation[&WhirlwindAttack&];
State_Wait=animation[&Idle&];
//为动画控制器加入武器拖尾脚本
mController.AddTrail(mWeapTrailL);
mController.AddTrail(mWeapTrailR);
//设置拖尾效果
mWeapTrailL.SetTime (3.0f, 0, 1);//设置拖尾时间为3秒
mWeapTrailR.SetTime (3.0f, 0, 1);//设置拖尾时间为3秒
void OnGUI()
if(GUILayout.Button(&翔龙斩&,GUILayout.Height(30)))
mController.PlayAnimation(State_Attack1);
StartCoroutine(&ReSetToWait&);
if(GUILayout.Button(&裂穹击&,GUILayout.Height(30)))
mController.PlayAnimation(State_Attack2);
StartCoroutine(&ReSetToWait&);
if(GUILayout.Button(&天罡伏魔&,GUILayout.Height(30)))
mController.PlayAnimation(State_Attack3);
StartCoroutine(&ReSetToWait&);
if(GUILayout.Button(&乱剑悬月&,GUILayout.Height(30)))
mController.PlayAnimation(State_Attack4);
StartCoroutine(&ReSetToWait&);
//0.5秒后恢复到等待状态
IEnumerator ReSetToWait()
yield return new WaitForSeconds(0.5F);
mController.PlayAnimation(State_Wait);
& & & &这里须要注意以几点:& & & &1、使用PacketRPG时,模型动画将不受模型自带的Animation组件的控制,我们须要使用Animation Controller来控制模型动画。详细方法是PlayAnimation(AnimtaionState mState)& & & &2、在PacketRPG中,通过SetTime()方法来设置武器拖尾的时间,通过StartTrail()和FadeOut()来实现特效的渐入渐出效果。当然,我们能够通过WeaponTrain脚本来设置,详细參数的意义大家能够查阅文档。& & & &3、该脚本中的两个WeapTrail对象分别指向我们实现定义好的LeftWeaponTrail、RightWeaponTrail。& & & &好了,我们来看看终于的效果吧:& & & &技能一:翔龙斩& & & & &技能二:裂穹击& & & 技能三:乱剑悬月& & & &&& & & & &好了,这就是今天的博客了,希望对大家实用、希望大家喜欢! & && & & & 每日箴言:有两样东西,愈是常常和持久地思考它们,对它们日久弥新和不断增长之魅力以及崇敬之情就愈加充实着心灵:我头顶的星空,和我心中的道德法则——康德& & & &&喜欢我的博客请记住我的名字:秦元培,我的博客地址是:blog.csdn.net/qinyuanpei& & & & 转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/& & &
阅读(...) 评论()

我要回帖

更多关于 unity3d 粒子特效 的文章

 

随机推荐