unity3d 射击模型带动画_unity3d模型动画 - CSDN
  • Unity3D游戏中的怪物的模型资源,包含多种怪物,附带骨骼动画的package文件,导入到项目中即可使用。
  • 1.首先,导入unity3D自带的Characters包,里面有很实用的第一人称和第三人称控制的Prefabs,自己开发小游戏的时候,可以用这些模型来调试效果。2.在数据包里寻找自己适用的Prefabs拖拽到场景中(我一般是选...

    1.首先,导入unity3D自带的Characters包,里面有很实用的第一人称和第三人称控制的Prefabs,自己开发小游戏的时候,可以用这些模型来调试效果。

    2.在数据包里寻找自己适用的Prefabs拖拽到场景中(我一般是选ThirdpersonController):


    3.新建一个空物体,把自己做好的模型放进去。把ThirdpersonController的所有Component复制给父物体。注意,脚本里的数值,要再次Copy compon,然后到父物体的对应脚本Paste Component Values。只Copy compon一次,脚本的数值是不会一并复制过去的。

    4.父物体的Animator现在是复制ThirdpersonController的,他的Avatar与我们自己做的模型骨架是不匹配的:

    (父物体)

    将父物体的Avatar换成子物体(我们自己的模型)的Avatar一样:

    (子物体)

    5.最后检查一下Capsule Collider的大小。


    第一人称的选FPSController,把它直接拖到Hierarchy面板,再把模型拖到他里面即可

    展开全文
  • unity3d 枪支武器包,FPS第一人称射击游戏,模型贴图完整,包含动画脚本。 http://www.6m5m.com/data/uploads/2014/03/21/31314532b9d31da624.jpg
  • Unity3D控制动画播放

    2016-05-02 13:22:26
      用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西。这次做一个TPS的项目就...解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D动画系统(Le

    原文链接:http://blog.csdn.net/sparrowfc/article/details/8240165

     

    用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西。这次做一个TPS的项目就遇到了这样一个问题,如何同时在上下半身播放不同的动画?解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D的动画系统(Legacy),虽然4.0出了新的动画控制系统,使用了一下功能相比原来确实强大不少,但还是将这次对于原先的动画系统的学习总结记录下来,毕竟这些动画的概念与策略是通用的,而且因为4.0在mac上目前貌似还没有破解所以项目还是得在3.5上做。相信对于深入理解新的动画系统也会很有帮助。

    一、Unity3D动画系统相关类

    1.1 AnimationClip

    AnimationClip是Unity3D中播放动画的最基本对象,通过FBX导入的各个动画对象其实就是一个AnimationClip。这个类已关键帧的形式记录了骨骼关节在各个时间节点上的位置、旋转信息,根据帧频率frameRate结合播放模式wrapMode通过插值计算即可播放出连续的骨骼动画。

    1.2 AnimationState

    每个AnimationState包含了一个AnimationClip,并记录这个动画片段的一些播放控制属性,实际上是一个AnimationClip的包装器。

    其中比较重要的参数有layer,weight, enabled, speed, blendMode这几项。这些参数的具体含义将在自定义混合动画控制中详细解释,在简单的动画控制时并不需要对AnimationState进行直接操作。

    1.3 Animation

    Animation是Unity3D的动画播放控制组件,包含了一系列的AnimationState对象,提供各种动画播放及控制方法。常用方法有Play(), CrossFade(), Stop()。在脚本中通过animation即可直接引用同一物体上的Animation控件。


    二、简单动画播放控制

    所谓简单动画播放控制就是同一时间只有一个动作,比如Standard Assets中的那个水管工,静止idle,走walk,跑run,跳跃jump,攻击attack这些动作都是全身动作,同一时间只应该做一种动作,只有在动作切换时需要将两种切换动作进行混合以达到平滑过渡的效果,以上的操作使用Animation提供的CrossFade()方法即可达到。无论是CrossFade还是Play理论上都只需要在切换动画时调用一次即可,当然重复的调用并不会影响动画的播放,当Unity3D检测到当前播放的动画与函数调用使用的动画一样后会忽略该次调用。


    三、自定义混合动画控制

    3.1 多动画同时播放的需求

    在大多数情况下简单的动画播放控制已经足够,然而当游戏变得复杂时,单动画播放带来的问题就是美术工作量的急剧增加。

    最为典型的就是第三人称射击(动作)游戏,通常来说游戏中的人物会有各种上身动作如瞄准、射击、换子弹等,而下身则对应站立,行走(通常还是四个方向的行走动作)。这时候如果只能播放一个动作的话就需要美工制作大量的动作(站立瞄准、站立射击、跑步瞄准、跑步射击等等),其工作量可想而知。显然,最为效率的方式是美工分别做出上半身以及下半身的动作,然后由程序根据游戏角色的操作将两者动作混合起来同时播放。而这就涉及到了多动画同时播放的需求。此时简单的CrossFade()方法已经不能满足了,我们需要通过AnimationState来对动画播放进行自定义的控制。

    3.2 使用AnimationState控制动画播放

    Unity3D的动画播放实际上都是通过AnimationState来进行控制的,Animation组件中提供的CrossFade,Play等方法其实就是将一系列对AnimationState参数进行设置的操作进行了封装。

    其中主要相关的参数有四个:

    layer: 该动画片段(AnimationClip)所在的播放层次。

    weight: 该动画片段在动画混合中所占的权重(0~1)

    enable: 该动画片段是否进行播放

    blendMode: 混合方式,有两种Blend和Additive

    默认初始化情况下Animation组件中的全部AnimationState的layer=0,weight=0, enable=false。Animation组件默认播放的AnimationState的layer=0, weight=1, enable=true。

     

    一、Unity3D动画播放策略

    Unity3D在进行动画播放时按照下面的策略进行:

    1.找到最高一层的全部AnimationState

    2.将其中enable为true且weight > 0的AnimationState中的clip加入混合池(虚构的一个概念)

    3.如果当前混合池中全部blendMode为Blend的clip的权重相加少于1,则找到下一层的全部AnimationState。重复2.

    4.对混合池中的全部clip进行混合操作,生成最终的动作。

    在进行最终混合时所有clip的实际权重会进行归一化处理,即相加为1,处理时根据blendMode的不同结果也会有所差异,下面的例子会进一步说明。

     

    二、使用AnimationState控制播放的实例

    举几个实际的例子对Unity3D的动画混合策略进行说明。对于AnimationState的设置全部放在Start或Awake中进行。并且注意把Animation组件中的默认播放动画设为None,取消选中Player Automatically,原因正如前文所述,默认播放的AnimationState参数初始值与其他State不同,会对实验造成影响。

    1. 同一层动画的混合播放

    AnimationState right= animation[“run_right”];

    AnimationState idle= animation[“idle”];

    right.layer = 1;right.weight = 1; right.enable = true;

    idle = 1; idle.weight= 1; idle.enable = true;

     运行结果是角色动画介于行走与静止之间,体现两个动画1:1的混合效果

    2. 高层动画覆盖下层动画

     right.layer = 1; right.weight = 1;right.enable = true;

    idle = 0; idle.weight = 1; idle.enable = true;

     运行结果是角色行走

    3. 高层动画与下层动画混合

    right.layer = 1; right.weight = 0.5f; right.enable = true;

    idle = 0; idle.weight = 1; idle.enable = true;

    运行结果与1相同,idle的实际weight为1 * (1 – 0.5f)

    4. 使用Additive混合不同层动画

    right.layer = 1; right.weight = 1; right.enable = true;

    right.blendMode = BlendMode.Addictive;

    idle = 0; idle.weight = 1; idle.enable = true;

     运行结果与1相同,idle的实际weight为1/(1+1)

     

    三、其他的动画播放控制参数

    speed: 控制动画播放速度,比如调整射击速度就是将该值提高

    time: 当前动画所在时间点

    warpMode: 动画循环方式,有一次、循环、镜像循环PingPong

    3.3 自定义动画过渡

    动画过渡实际上就是两种动画混合权重的过渡,前一种动画的权重由1渐变为0,后一种由0变为1,由此实现动画的平滑过渡。在实际操作时,并不需要过渡时在Update()中每帧去调整两种动画AnimationState的权重weight。Animation控件提供了Blend()方法帮助在后台自动计算这种过渡,其使用方法与CrossFade类似,详见Unity3D的script手册。

    3.4 Play(), CrossFade()背后的操作

    了解这些基本方法背后进行的操作在同时使用AnimationState对动作进行控制时十分有用。

    首先是Play(stringanimationName)(Play() = Play(default Animation name))这个方法实际上是将animationName所在层的全部其他AnimationState的weight置为0,enable置为false,将animationName的weight置为1, enable置为true。

    CrossFade()与Play()大致相同,只不过他并不直接将其他的AnimationState的weight置为0,而是调用Blend()方法将其向0进行渐变,一旦该AnimationState的weight变为0再将其enable设置为false。

    由此可见,当你设置了多层AnimationState后,仅仅调用这两个方法很可能并不能达到你想要的动画控制效果。当然,这两个方法最后有一个默认参数PlayMode来调整执行策略(区别就在于操作对象仅仅在该层还是全部AnimationState对象),总之这一节通过阐述Play与CrossFade背后的操作,希望使我们在使用AnimationState进行混合动画控制编程时能够正确的使用这两个方法以达到期望的效果。

    3.5 局部动画

    以上所介绍的AnimationState操作只是多动画的手动播放及混合控制,还并没有涉及到如何向开头所讲的上下半身播放不同的动画。要在同一个角色上同时播放两个不同的动作使用局部动画即可。

    一、生成局部动画

    在Unity3D中有两种方式实现局部动画,一是使用AnimationState的AddMixingTransform方法,该方法传入一个骨骼节点的Transform,调用后该动画片段AnimationClip便只会影响该节点及其子骨骼,而对其他骨骼关节并不再影响。

    另一种方法是在动画模型制作时就只对局部的骨骼制作动画,其他骨骼在整个动画片段中都保持不变,这样生成的动画片段AnimationClip中就不会包括对那些不变骨骼的关键帧信息,也就不会对其他骨骼关节进行影响。(这是我根据动画播放的实际控制结果进行的推测,在Unity3D的官方文档中好像并没有直接说明,仍需查证)

    了解第二种方法十分重要,虽然还只是推测。因为在与美术沟通前你可能并不知道导入的是一个局部动画,而将其当成全身动画,使得在进行动画混合控制时产生了意想不到的结果。我在一次项目中发现明明角色应该进入idle状态,但是双腿仍然在跑动,为此花了两天时间查证,也是直接促成了这篇文章的诞生,最终发现原来美术给的idle只有上半身有动画,下半身没有,因此虽然idle比跑动高一层,但下半身并不能覆盖。

     

    二、局部动画的混合

    局部动画的混合策略与前述Unity3D动画播放策略相同,只不过只是影响局部骨骼。这也就是说,上半身与下半身的动画无论谁所在的层更高,权重多少都不会影响另外半身的动画播放。但是上层的半身动画会覆盖下层的全身动画或与之混合,而全身动画中不包含在半身动画中的骨骼则完全不受影响。


    四、射击类游戏应用

    参考Unity3.5的官方例子Angry Robot。在这个例子中很好的实现了上下半身的独立旋转,射击动作与跑步动作的半身分离。这一节以此作为样例进行分析。

    动作资源:

    run_forward,fun_backward, run_left, run_right。四方向的跑动,全身动作,全部置于第1层。

    Idle。静止,全身动作,位于第2层。

    Attack。攻击,半身动作,位于第4层。混合方式Additive

    操作控制:

    初始化,全部动作的weight置为1,Attack的enable置为false,其余为true。这样初始状态下Attack不播放,Idle覆盖跑动动作,角色表现为静止站立动作。

    移动时将Idle的weight根据速度向0渐变,开放跑动动作。使用CrossFade()在四个跑动动作中选择合适的动作进行播放。停止时再将Idle的weight逐渐置为1,重新覆盖跑动动作。

    攻击时将Attack的enable置为true,停止攻击时置为false。由于Attack动作在最高层,且混合模式为Additive,因此站立攻击时Attack动作与行走动作上半身进行混合,跑动攻击时Attack动作与跑动动作上半身进行混合。

     

    展开全文
  • 本课程以一款小型的第三人称射击游戏为案例,手把手教你如何搭建一款3D射击游戏的雏形。麻雀虽小,五脏俱全,这款小游戏难度不大,但第三人称射击游戏该有的模块、功能它都有涉及。通过案例游戏的开发,学习者可以对...
  • 解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D动画系统(Legacy),虽然4.0出了新的动画控制系统,使用了一下功能相比原来确实强大不少,但还是将这次对于...

    用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西。这次做一个TPS的项目就遇到了这样一个问题,如何同时在上下半身播放不同的动画?解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D的动画系统(Legacy),虽然4.0出了新的动画控制系统,使用了一下功能相比原来确实强大不少,但还是将这次对于原先的动画系统的学习总结记录下来,毕竟这些动画的概念与策略是通用的,而且因为4.0在mac上目前貌似还没有破解所以项目还是得在3.5上做。相信对于深入理解新的动画系统也会很有帮助。

    一、Unity3D动画系统相关类

    1.1 AnimationClip

    AnimationClip是Unity3D中播放动画的最基本对象,通过FBX导入的各个动画对象其实就是一个AnimationClip。这个类已关键帧的形式记录了骨骼关节在各个时间节点上的位置、旋转信息,根据帧频率frameRate结合播放模式wrapMode通过插值计算即可播放出连续的骨骼动画。

    1.2 AnimationState

    每个AnimationState包含了一个AnimationClip,并记录这个动画片段的一些播放控制属性,实际上是一个AnimationClip的包装器。

    其中比较重要的参数有layer,weight, enabled, speed, blendMode这几项。这些参数的具体含义将在自定义混合动画控制中详细解释,在简单的动画控制时并不需要对AnimationState进行直接操作。

    1.3 Animation

    Animation是Unity3D的动画播放控制组件,包含了一系列的AnimationState对象,提供各种动画播放及控制方法。常用方法有Play(), CrossFade(), Stop()。在脚本中通过animation即可直接引用同一物体上的Animation控件。


    二、简单动画播放控制

    所谓简单动画播放控制就是同一时间只有一个动作,比如Standard Assets中的那个水管工,静止idle,走walk,跑run,跳跃jump,攻击attack这些动作都是全身动作,同一时间只应该做一种动作,只有在动作切换时需要将两种切换动作进行混合以达到平滑过渡的效果,以上的操作使用Animation提供的CrossFade()方法即可达到。无论是CrossFade还是Play理论上都只需要在切换动画时调用一次即可,当然重复的调用并不会影响动画的播放,当Unity3D检测到当前播放的动画与函数调用使用的动画一样后会忽略该次调用。


    三、自定义混合动画控制

    3.1 多动画同时播放的需求

    在大多数情况下简单的动画播放控制已经足够,然而当游戏变得复杂时,单动画播放带来的问题就是美术工作量的急剧增加。

    最为典型的就是第三人称射击(动作)游戏,通常来说游戏中的人物会有各种上身动作如瞄准、射击、换子弹等,而下身则对应站立,行走(通常还是四个方向的行走动作)。这时候如果只能播放一个动作的话就需要美工制作大量的动作(站立瞄准、站立射击、跑步瞄准、跑步射击等等),其工作量可想而知。显然,最为效率的方式是美工分别做出上半身以及下半身的动作,然后由程序根据游戏角色的操作将两者动作混合起来同时播放。而这就涉及到了多动画同时播放的需求。此时简单的CrossFade()方法已经不能满足了,我们需要通过AnimationState来对动画播放进行自定义的控制。

    3.2 使用AnimationState控制动画播放

    Unity3D的动画播放实际上都是通过AnimationState来进行控制的,Animation组件中提供的CrossFade,Play等方法其实就是将一系列对AnimationState参数进行设置的操作进行了封装。

    其中主要相关的参数有四个:

    layer: 该动画片段(AnimationClip)所在的播放层次。

    weight: 该动画片段在动画混合中所占的权重(0~1)

    enable: 该动画片段是否进行播放

    blendMode: 混合方式,有两种Blend和Additive

    默认初始化情况下Animation组件中的全部AnimationState的layer=0,weight=0, enable=false。Animation组件默认播放的AnimationState的layer=0, weight=1, enable=true。

     

    一、Unity3D动画播放策略

    Unity3D在进行动画播放时按照下面的策略进行:

    1.找到最高一层的全部AnimationState

    2.将其中enable为true且weight > 0的AnimationState中的clip加入混合池(虚构的一个概念)

    3.如果当前混合池中全部blendMode为Blend的clip的权重相加少于1,则找到下一层的全部AnimationState。重复2.

    4.对混合池中的全部clip进行混合操作,生成最终的动作。

    在进行最终混合时所有clip的实际权重会进行归一化处理,即相加为1,处理时根据blendMode的不同结果也会有所差异,下面的例子会进一步说明。

     

    二、使用AnimationState控制播放的实例

    举几个实际的例子对Unity3D的动画混合策略进行说明。对于AnimationState的设置全部放在Start或Awake中进行。并且注意把Animation组件中的默认播放动画设为None,取消选中Player Automatically,原因正如前文所述,默认播放的AnimationState参数初始值与其他State不同,会对实验造成影响。

    1. 同一层动画的混合播放

    AnimationState right= animation[“run_right”];

    AnimationState idle= animation[“idle”];

    right.layer = 1;right.weight = 1; right.enable = true;

    idle = 1; idle.weight= 1; idle.enable = true;

     运行结果是角色动画介于行走与静止之间,体现两个动画1:1的混合效果

    2. 高层动画覆盖下层动画

     right.layer = 1; right.weight = 1;right.enable = true;

    idle = 0; idle.weight = 1; idle.enable = true;

     运行结果是角色行走

    3. 高层动画与下层动画混合

    right.layer = 1; right.weight = 0.5f; right.enable = true;

    idle = 0; idle.weight = 1; idle.enable = true;

    运行结果与1相同,idle的实际weight为1 * (1 – 0.5f)

    4. 使用Additive混合不同层动画

    right.layer = 1; right.weight = 1; right.enable = true;

    right.blendMode = BlendMode.Addictive;

    idle = 0; idle.weight = 1; idle.enable = true;

     运行结果与1相同,idle的实际weight为1/(1+1)

     

    三、其他的动画播放控制参数

    speed: 控制动画播放速度,比如调整射击速度就是将该值提高

    time: 当前动画所在时间点

    warpMode: 动画循环方式,有一次、循环、镜像循环PingPong

    3.3 自定义动画过渡

    动画过渡实际上就是两种动画混合权重的过渡,前一种动画的权重由1渐变为0,后一种由0变为1,由此实现动画的平滑过渡。在实际操作时,并不需要过渡时在Update()中每帧去调整两种动画AnimationState的权重weight。Animation控件提供了Blend()方法帮助在后台自动计算这种过渡,其使用方法与CrossFade类似,详见Unity3D的script手册。

    3.4 Play(), CrossFade()背后的操作

    了解这些基本方法背后进行的操作在同时使用AnimationState对动作进行控制时十分有用。

    首先是Play(stringanimationName)(Play() = Play(default Animation name))这个方法实际上是将animationName所在层的全部其他AnimationState的weight置为0,enable置为false,将animationName的weight置为1, enable置为true。

    CrossFade()与Play()大致相同,只不过他并不直接将其他的AnimationState的weight置为0,而是调用Blend()方法将其向0进行渐变,一旦该AnimationState的weight变为0再将其enable设置为false。

    由此可见,当你设置了多层AnimationState后,仅仅调用这两个方法很可能并不能达到你想要的动画控制效果。当然,这两个方法最后有一个默认参数PlayMode来调整执行策略(区别就在于操作对象仅仅在该层还是全部AnimationState对象),总之这一节通过阐述Play与CrossFade背后的操作,希望使我们在使用AnimationState进行混合动画控制编程时能够正确的使用这两个方法以达到期望的效果。

    3.5 局部动画

    以上所介绍的AnimationState操作只是多动画的手动播放及混合控制,还并没有涉及到如何向开头所讲的上下半身播放不同的动画。要在同一个角色上同时播放两个不同的动作使用局部动画即可。

    一、生成局部动画

    在Unity3D中有两种方式实现局部动画,一是使用AnimationState的AddMixingTransform方法,该方法传入一个骨骼节点的Transform,调用后该动画片段AnimationClip便只会影响该节点及其子骨骼,而对其他骨骼关节并不再影响。

    另一种方法是在动画模型制作时就只对局部的骨骼制作动画,其他骨骼在整个动画片段中都保持不变,这样生成的动画片段AnimationClip中就不会包括对那些不变骨骼的关键帧信息,也就不会对其他骨骼关节进行影响。(这是我根据动画播放的实际控制结果进行的推测,在Unity3D的官方文档中好像并没有直接说明,仍需查证)

    了解第二种方法十分重要,虽然还只是推测。因为在与美术沟通前你可能并不知道导入的是一个局部动画,而将其当成全身动画,使得在进行动画混合控制时产生了意想不到的结果。我在一次项目中发现明明角色应该进入idle状态,但是双腿仍然在跑动,为此花了两天时间查证,也是直接促成了这篇文章的诞生,最终发现原来美术给的idle只有上半身有动画,下半身没有,因此虽然idle比跑动高一层,但下半身并不能覆盖。

     

    二、局部动画的混合

    局部动画的混合策略与前述Unity3D动画播放策略相同,只不过只是影响局部骨骼。这也就是说,上半身与下半身的动画无论谁所在的层更高,权重多少都不会影响另外半身的动画播放。但是上层的半身动画会覆盖下层的全身动画或与之混合,而全身动画中不包含在半身动画中的骨骼则完全不受影响。


    四、射击类游戏应用

    参考Unity3.5的官方例子Angry Robot。在这个例子中很好的实现了上下半身的独立旋转,射击动作与跑步动作的半身分离。这一节以此作为样例进行分析。

    动作资源:

    run_forward,fun_backward, run_left, run_right。四方向的跑动,全身动作,全部置于第1层。

    Idle。静止,全身动作,位于第2层。

    Attack。攻击,半身动作,位于第4层。混合方式Additive

    操作控制:

    初始化,全部动作的weight置为1,Attack的enable置为false,其余为true。这样初始状态下Attack不播放,Idle覆盖跑动动作,角色表现为静止站立动作。

    移动时将Idle的weight根据速度向0渐变,开放跑动动作。使用CrossFade()在四个跑动动作中选择合适的动作进行播放。停止时再将Idle的weight逐渐置为1,重新覆盖跑动动作。

    攻击时将Attack的enable置为true,停止攻击时置为false。由于Attack动作在最高层,且混合模式为Additive,因此站立攻击时Attack动作与行走动作上半身进行混合,跑动攻击时Attack动作与跑动动作上半身进行混合。


    展开全文
  • 最近有许多朋友问到我一个问题,如何实现像战地,使命召唤那样逼真的射击体验。首先我们要知道,在没有动画师的帮助下,要想实现人为模拟的后坐力,精准度偏移等等其实并不是什么难事,今天我们就来用较简短的代码来...

    最近有许多朋友问到我一个问题,如何实现像战地,使命召唤那样逼真的射击体验。首先我们要知道,在没有动画师的帮助下,要想实现人为模拟的后坐力,精准度偏移等等其实并不是什么难事,今天我们就来用较简短的代码来实现一个模拟的枪械后坐力。

    首先是我们需要用到的工具类代码:

    public class Spring3
    {
    	public Vector3 value = Vector2.zero;
    	private Vector3 dampValue = Vector2.zero;
    	private float damp = 1;
    	private float frequence = 1;
     	public void Clear ()
    	{
    		value = Vector2.zero;
    		dampValue = Vector2.zero;
    	}
    	public Spring3 (float damp, float frequence)
    	{
    		this.damp = damp;
    		this.frequence = frequence;
    	}
    	public void Update (float deltaTime, Vector3 target)
    	{
    		value -= dampValue * deltaTime * frequence;
    		dampValue = Vector3.Lerp (dampValue, value - target, deltaTime * damp);
    	}
    }
    	public class SpringEulerAngle
    	{
    		public Vector3 value = Vector2.zero;
    		private Vector3 dampValue = Vector2.zero;
    		private float damp;
    		private float frequence = 1;
    
    
    		public SpringEulerAngle (float damp, float frequence)
    		{
    			this.damp = damp;
    			this.frequence = frequence;
    		}
    
    
    		public void Clear ()
    		{
    			value = Vector2.zero;
    			dampValue = Vector2.zero;
    		}
    
    
    		public void Update (float deltaTime, Vector3 target)
    		{
    			value -= dampValue * deltaTime * frequence;
    			dampValue = eulerLerp (dampValue, value - target, deltaTime * damp);
    		}
    
    
    		public static Vector3 eulerLerp(Vector3 left, Vector3 right, float t){
    			Vector3 ret;
    			ret.x = Mathf.LerpAngle (left.x, right.x, t);
    			ret.y = Mathf.LerpAngle (left.y, right.y, t);
    			ret.z = Mathf.LerpAngle (left.z, right.z, t);
    			return ret;
    		}
    	}
    
    这是我们在进行模拟时最常用的一个算法,我称之为弹簧算法(实在起不出好名字了嘿嘿),算法非常简单,我们只需要把自己的value输入进去,作为希望插值的目标,然后调用Update函数就可以让value以弹性姿势像target靠拢,需要注意的是damp和frequency这两个浮点数的用处,可以看到damp越高插值速率越高,越快的趋近于目标点,而frequency越高弹簧震动的越快,我们在之后的模拟中会用到这两个值的。

    通过使用弹簧算法,我们可以很轻松的实现一个让抬起的枪口归位的动作,那么我们怎么实现一套完整的后坐力弧线呢。要知道我们在开枪的时候(去过射击场的朋友应该知道),枪口是呈现一个类似抛物线的运动,在扣动扳机瞬间枪口迅速上抬,随即在胳膊与胸口的压力下枪的上抬幅度慢慢降低并开始下降,降到开枪前的点,所以我们需要在代码中模拟这一系列动作。

    这时有同学就会问了,直接把摄像机或者枪的transform.eulerAngles绑到上边代码中的value不就行了么,这期教程不就可以结束了么,如果这样想我只能说这位同学有些失了智,有灵性的同学应该已经发现了问题,单纯通过一个弹簧,只能模拟枪口归位,但是枪口上抬这个过程就只能强行进行角度偏移,就没法实现我们说过的抛物线效果。所以我们应该用另一个插值来模拟一整套后坐力。将以下脚本挂载到枪或摄像机上,即可触发后坐力。

    明白了道理以后,就非常容易实现了,我们这里写一段非常简单的代码,通过点击鼠标左键触发,给目标加一段随机的角度,并且实现一个抛物线性质的偏移,注意,因为后坐力控制属于物理运动,所以应该放在FixedUpdate中执行,FixedUpdate与Update的执行关系这里就不赘述了。

    public class Recoil : MonoBehaviour {
    	SpringEulerAngle recoilTarget;
    	public float damp = 20;
    	public float frequence = 15;
    	void Awake(){
    		recoilTarget = new SpringEulerAngle (damp, frequence);
    	}
    	
    	// Update is called once per frame
    	void FixedUpdate () {
    		recoilTarget.Update (Time.deltaTime, Vector3.zero);
    		transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (recoilTarget.value), 0.75f);	//这里使用一个较大的插值数字以实现枪口的迅速抬升
    	}
    
    	void Update(){
    		if (Input.GetMouseButtonDown (0)) {
    			recoilTarget.value = new Vector3 (Random.Range (-20, 0), Random.Range (-3, 3), 0);	//这里做一个随机偏移来模拟后坐力。
    		}
    	}
    }
    
    将这段控制后坐力的代码保存为Recoil.cs并且挂载到摄像机或者模型上,运行点击左键就可以看出效果,只不过要想实现自己理想的后坐力,需要通过不停的调参来获得令自己满意,令策划满意的效果。

    展开全文
  • unity3d 动画制作 Unity 3D中的动画动画制作 (Animation and Animator in Unity 3D) Animation is one among the two components of a game, which brings it to life (the other being audio). Unity’s ...
  • 本来一个模型有三个动画结果再3dmax上面只有一个动画,而且是一个完整的三个动画连贯起来的,后来才知道建模的时候一个模型只能做出一个动画,但是unity的一个模型包含射击死亡等多个动画是切割出来的。 方法如下:...
  • 游戏简介:一个只能移动枪口的射击游戏,敌人会在前方场景随机生成,需要玩家在20秒的时间内尽可能多地开枪击杀。 1.枪支随鼠标移动 先导入网上找到的场景模型、枪支模型(网上找来的免费资源,感谢网友!),如图...
  • unity3d中的动画

    2015-07-07 21:44:11
    本文介绍了unity3d动画相关的一些概念。
  • Unity3D教程:动画融合、动画层、动画混合、附加动画、程序动画动画重放和取样 动画脚本 Animation Scripting Unity's 动画系统允许你创建一个漂亮的动画蒙皮角色,动画系统支持动画融合,混合,添加动画,步调周期...
  • 在贴近墙时,播放垂下枪的动画使枪与身体平行,这样模型就不会穿墙,一般配合第一种方法使用效果更佳,这种方法是目前看来最为完美的一种解决方法,然而,这种方法需要美术人员的动画设计以及美工人...
  • 已有好些天没写什么了,今天想起来该写点东西了。...老实说,我学Unity时,角色控制真的是一个难点,尤其是动画方面。想要在Unity中控制好一个角色且让这个角色的动作协调,不是一个简单的问题,需要我们深入理解其
  • 本课程以一款小型的第三人称射击游戏为案例,手把手教你如何搭建一款3D射击游戏的雏形。麻雀虽小,五脏俱全,这款小游戏难度不大,但第三人称射击游戏该有的模块、功能它都有涉及。通过案例游戏的开发,学习者可以对...
  • 动画脚本 Animation Scripting   有时你需要程序化的驱动你的角色骨骼. 例如你可能需要你的角色的头注视3d空间的某个点. 这个活最好让脚本来干. 幸运的是, Unity做这个很容易. 在Unity 中所有骨骼来驱动...
  • unity3d 各大插件评测

    2018-01-30 15:00:43
    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具...
1 2 3 4 5 ... 20
收藏数 635
精华内容 254
关键字:

unity3d 射击模型带动画