我有一个2d RPG点击移动游戏。我想改进我的代码,以便我的玩家动画看起来不坏,例如这是我的播放器动画的video。正如你所看到的那样,我的播放器的空闲状态动画并不是最好的。该视频还允许您查看我的动画师,以防万一我在混合树或过渡中犯了错误。如何改进我的代码,以便我的播放器的动画不错,我的播放器的空闲状态动画面向它所面对的正确方向。谢谢!
private Animator anim;
public float speed = 15f;
private Vector3 target;
private bool touched;
private bool playerMovementRef;
void Start()
{
target = transform.position;
anim = GetComponent<Animator>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector3 mousePosition = Input.mousePosition;
mousePosition.z = 10; // distance from the camera
target = Camera.main.ScreenToWorldPoint(mousePosition);
target.z = transform.position.z;
var movementDirection = (target - transform.position).normalized;
if (movementDirection.x != 0 || movementDirection.y != 0)
{
anim.SetBool("walking", true);
anim.SetFloat("SpeedX", movementDirection.x);
anim.SetFloat("SpeedY", movementDirection.y);
if (movementDirection.x < 0)
{
anim.SetFloat("LastMoveX", -1f);
}
else if (movementDirection.x > 0)
{
anim.SetFloat("LastMoveX", 1f);
}
else
{
anim.SetFloat("LastMoveX", 0f);
}
if (movementDirection.y > 0)
{
anim.SetFloat("LastMoveY", 1f);
}
else if (movementDirection.y < 0)
{
anim.SetFloat("LastMoveY", -1f);
}
else
{
anim.SetFloat("LastMoveY", 0f);
}
}
}
else
{
if (Mathf.Approximately(transform.position.x, target.x) && Mathf.Approximately(transform.position.y, target.y))
{
touched = false;
anim.SetBool("walking", false);
}
else
{
transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
}
}
}
}
为了更清楚,我想做这样的事情:http://imgur.com/j7gBeDA但是我的代码有问题,我很接近它只是在它进入空闲状态时没有正确面对。我已经检查了“退出时间”是否已开启,但事实并非如此,所以我不确定我做错了什么。我也确保我调试它。它并没有完全给我一个我正在寻找的答案。
答案 0 :(得分:1)
目前,您正在使用一大堆if-then
块来设置mechanim控制器中的各种浮点数,最终控制角色所面对的方向。 movementDirection.x
和movementDirection.y
都可能(实际上非常可能)为非负数。但是,您的动画面板只是四向的,因此您需要将2D矢量转换为在其x
和y
之间仅具有一个非零值的矢量。
Vector3 animDirection = Vector3.zero;
if (movementDirection.sqrMagnitude > 0)
{
// Use >= to default to horizontal on both being equal
if (movementDirection.x > movementDirection.y)
animDirection.x = 1;
else
animDirection.y = 1;
}
答案 1 :(得分:0)
在你的空闲动画中,你有一个混合树,在Freeform Cartesian中有四种不同的状态。问题是你只有四个离散的动画可供选择,而不是像3d中的情况那样无限的运动范围。看起来发生的事情是你为LastMoveX和LastMoveY中的每一个获得非零值。因此,结果将动画放在混合树的一个角落 - 正好在两个状态之间。我认为决定最终结果面临哪种方式的唯一因素是浮点不精确。要解决这个问题,您可以将空闲状态的逻辑归结为它的四个组件,单个变量可能会起作用,只需将每个动画分配给一个值。