Unity3D 2D角色根据鼠标方向改变动画
本篇文章是通过动画控制器 (Animator) 中的混合树 (Blend Tree) 来实现2D角色看向鼠标方向,希望能对您有帮助。
还记得我曾经的毕设,是一款2D解谜游戏,游戏中的小人会根据鼠标位置看向不同的方向。那个时候我通过动画控制器 (Animator) 实现了这个功能,但这个方法给我造成了下图的困扰。。。
看,如此之多的状态让动画控制器 (Animator) 一片混乱!
由于游戏中玩家有待机、移动、死亡等状态,而每个状态又有四种朝向,这就使得动画控制器需要控制状态数乘 4 数量的状态,从而使得动画控制器 (Animator) 里一片混乱。
不过还好有混合树 (Blend Tree) ,它可以帮助我们更好的管理自己的动画。你只需要在动画控制器 (Animator) 中右键 -> Creat State -> From New Blend Tree 就能创建它。
因为我们要通过鼠标来控制它,所以要先在动画控制器 (Animator) 的 Parameters 窗口创建两个 Float 。(注意:这里的命名最好和我一样,不然用下面我给出的代码运行会报错)
双击你创建的混合树 (Blend Tree) 即可编辑它,将其 Blend Type 改为 2D Freeform Directional (当然你也可以试试其它选择,效果会有细微的差别),并在其 Parameters 中填写你刚才创建的两个 Float 的名称。(注意:本人使用的 Unity 版本为 2019.2 ,早期版本的 Blend Type 中可能没有我的选项,那就选 2D 即可)
接下来,在 Motion 窗口加入四个方向的动画,并在其 Pos X 、 Pos Y 下输入如下值。
最后,在你动画控制器控制的角色或物体上加入脚本并写入如下代码。
Animator myAnimator;//角色自身动画控制器
private void Start()
{
myAnimator = GetComponent<Animator>();//获取角色自身动画控制器
}
private void Update()
{
PlayerLookMouse();//角色看向鼠标方向
}
//角色看向鼠标方向
void PlayerLookMouse()
{
//获取鼠标坐标
Vector2 worldMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);//获取鼠标的世界坐标
Vector2 localMousePosition = transform.InverseTransformPoint(worldMousePosition);//获取鼠标对于自身的局部坐标
//通过鼠标坐标改变动画方向
myAnimator.SetFloat("MousePositionX", localMousePosition.x);
myAnimator.SetFloat("MousePositionY", localMousePosition.y);
}
运行,会发现角色或物体会根据鼠标方向改变动画。