这几天电脑坏了,今天来测试一下控制角色,这样在上次人物动作的基础上让角色可以在场景里面跑起来。
首先为角色增加一个CharacterController。
然后设定一些变量控制角色的速度
var speed = 3.0;
var rotatationSpeed = 200.0;
private var curSpeed = 0.0;
function Update () {
// Rotate around y-axis
var newRotation = Input.GetAxis("Horizontal") * rotatationSpeed;
transform.Rotate(0, newRotation * Time.deltaTime, 0);
// Calculate speed
var newSpeed = Input.GetAxis("Vertical") * speed;
if (Input.GetKey("left shift"))
newSpeed *= 1.5;
// Move the controller
var controller : CharacterController = GetComponent (CharacterController);
var forward = transform.TransformDirection(Vector3.forward);
controller.SimpleMove(forward * newSpeed);
}
在Update函数里,我们根据输入计算出运行的速度和旋转的速度。最后通过控制器,让这个角色跑起来。
不过到目前为止这个角色跑起来开清动作就变得怪怪的,当按下开枪按钮的时候,这个人就开始滑行了,为了让这个人能够“边跑边打”,我们就要去混合刚才开枪和跑步的动作。
写了一半,电脑又坏了!~非常痛恨中关村里面的修理笔记本的!各位兄弟们千万别去了!实在不行一定要找个熟悉的人带着。
言归正传,要让我们控制的机器人可以一边跑一边射击,那么就必须要用到Unity中一个非常重要的动画技术 “动画混合Animation Mixing”。
找个动画文件来看看:[email protected]这个动画。在这套动画文件中,包含了很多的动画动作。我们的每一个动画都包含了好多的动作,其中包括了 手上的动作和腿脚的动作。通常情况下我们播放动画就是直接播放一个动作就可以了,但是遇到需要动作融合的时候,就不能直接的调用动画,而是要选用其中的一部分有用的动画。
现在我们要对Run这个动作和Shoot两个动作进行混合。先来看看Shoot的动作序列:在这个动作中基本上只包含了两个上身持枪和动作,下身基本上没动。这个动作融合主要是针对shoot的上半身。
首先,利用Shoot动画片段,生成一个新的动画片段"shootUpperBody"。
animation.AddClip(animation["shoot"].clip, "shootUpperBody");
animation["shootUpperBody"].AddMixingTransform(transform.Find("mover/roothandle/spine1"));
animation["shootUpperBody"].AddMixingTransform(transform.Find("mover/gun"));
增加两个混合矩阵,让动作融合。这个动画角色的动作骨骼矩阵包含四部分,我们选择的spine1是上身的动作矩阵的根矩阵:
然后在运动的代码中调用
animation.CrossFadeQueued("shootUpperBody", 0.3, QueueMode.PlayNow);
然后跑起来的的角色,就有shoot和run混合的效果。
function Update () {
if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1 || Mathf.Abs(Input.GetAxis("Horizontal")) > 0.1)
{
animation.CrossFade("run");
animation["run"].speed = Mathf.Sign(Input.GetAxis("Vertical"));
}
else
animation.CrossFade("idle");
// Play the cross fade animation
if (Input.GetButtonDown ("Jump"))
{
animation.CrossFade("jump", 0.3);
}
// Shoot
if (Input.GetButtonDown ("Fire1"))
{
// We are running so play it only on the upper body
if (animation["run"].weight > 0.5)
animation.CrossFadeQueued("shootUpperBody", 0.3, QueueMode.PlayNow);
// We are in idle so play it on the fully body
else
animation.CrossFadeQueued("shoot", 0.3, QueueMode.PlayNow);
}
}