c# - 单击以移动动画不起作用

标签 c# unity3d animator

我的游戏基础是一个简单的 2D 自上而下点击移动游戏 I。我创建了一个步行混合树和一个闲置混合树。这两个混合树都有 6 个方向的运动。我看了这个关于自上而下 8 方向运动的教程。 (https://www.youtube.com/watch?v=7URRg8J6mz8)。基本上我改变了脚本,以便它可以与我的点击移动脚本相匹配,但它不是 100% 完美。我的空闲状态无法正常工作,或者我的 Y 轴也没有正常工作,更具体地说,当我长按 Y 轴(假设我正在上升(+))时,它并没有真正在动画师中播放正确的动画. (现在假设我倒下了)它会播放正确的动画,但是(完成移动后)它会继续播放动画。我的参数也不能正常工作,SpeedY 和 LastMoveY 不稳定(如果我有任何意义的话)。有人可以帮我解决这个问题吗?如果有人不明白我的意思,这是我上传到谷歌驱动器的游戏预览! http://html.editey.com/file/0B6cfYGCOex7BVC1Ja3Q3N3d3NWc#

using UnityEngine;
using System.Collections;

public class move : MonoBehaviour {

private Animator anim;
public float speed = 15f;
public move playerMovementRef;
private Vector3 target;
private Vector3 playerObject;


void Start () {
    target = transform.position;
    anim = GetComponent<Animator> ();
}

void Update () {
    if (Input.GetMouseButtonDown(0)) {
        target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        target.z = transform.position.z;
    }
    transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
    float inputX = Input.GetAxis ("Mouse X");
    float inputY = Input.GetAxis ("Mouse Y");

    if (Input.touchCount > 0)
    {
        inputX = Input.touches[0].deltaPosition.x;
        inputY = Input.touches[0].deltaPosition.y;
    }

    anim.SetFloat ("SpeedX", inputX);
    anim.SetFloat ("SpeedY", inputY);

}

void FixedUpdate () {

    float LastInputX = Input.GetAxis ("Mouse X");
    float LastInputY = Input.GetAxis ("Mouse Y");

    if (Input.touchCount > 0)
    {
        LastInputX = Input.touches[0].deltaPosition.x;
        LastInputY = Input.touches[0].deltaPosition.y;
    }

    if (LastInputX != 0 || LastInputY != 0) {
        anim.SetBool ("walking", true);
        if (LastInputX > 0) {
            anim.SetFloat ("LastMoveX", 1f);
        } else if (LastInputX < 0) {
            anim.SetFloat ("LastMoveX", -1f);
        } else {
            anim.SetBool ("walking", false);
        }
        if (LastInputY > 0) {
            anim.SetFloat ("LastMoveY", 1f);
        } else if (LastInputY < 0) {
            anim.SetFloat ("LastMoveY", -1f);
        } else {
            anim.SetFloat ("LastMoveY", 0f);
        }

    } else {
        anim.SetBool ("walking", false);
    }
}

最佳答案

您不应在 FixedUpdate 中使用 Input 值。您应该将它存储在 Update 中的变量中,然后在 FixedUpdate 中检查它。

您还应该根据您的相机为鼠标位置添加一些深度。

错误:

void FixedUpdate () {
       if (Input.touchCount > 0)
       {
           ...
       }
}

正确:

    void Update () {
           ...
           if (Input.touchCount > 0)
           {
                touched = true;
           }
    }

    void FixedUpdate () {
           if (touched)
           {
                ...
           }
    }

示例:

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;
    }

    if (Input.touchCount > 0)
    {
        target.x = Input.touches[0].deltaPosition.x;
        target.y = Input.touches[0].deltaPosition.y;
    }

    transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
}

void FixedUpdate()
{
    float LastInputX = transform.position.x - target.x;
    float LastInputY = transform.position.y - target.y;

    if (LastInputX != 0 || LastInputY != 0)
    {
        anim.SetBool("walking", true);
        if (LastInputX > 0)
        {
            anim.SetFloat("LastMoveX", 1f);
        }
        else if (LastInputX < 0)
        {
            anim.SetFloat("LastMoveX", -1f);
        }
        else {
            anim.SetBool("walking", false);
        }
        if (LastInputY > 0)
        {
            anim.SetFloat("LastMoveY", 1f);
        }
        else if (LastInputY < 0)
        {
            anim.SetFloat("LastMoveY", -1f);
        }
        else {
            anim.SetFloat("LastMoveY", 0f);
        }

    }
    else {
        anim.SetBool("walking", false);
    }
}

关于c# - 单击以移动动画不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34118033/

相关文章:

c# - 将 ODataQuery 转换为 TableQuery 以使用 OData 查询 Azure 表存储

c# - 从 Unity 中的脚本关闭脚本

c# - 短时间显示文本层

android - 没有找到 android sdk (Unity)

c# - 如何检查动画师的某个动画状态是否正在运行?

c# - 如何使用 C# 从二进制文件中读取浮点值?

c# - 为什么我修改后的 .NET Windows 窗体在再次运行程序后没有显示新的更改?

unity-game-engine - GameObject.FindGameObjectWithTag 返回(克隆)?

java - 原生比。 Protoc编译器选项

java - Android ObjectAnimator 与 ViewPropertyAnimator