点击移动动画不起作用

Posted

技术标签:

【中文标题】点击移动动画不起作用【英文标题】:Click to move animation not working 【发布时间】:2016-03-11 03:19:36 【问题描述】:

我的游戏的基础是一个简单的 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);
    

【问题讨论】:

你能把你的“Inspector”窗口放上去吗? 嗯......? “你能把你的“检查员”窗口放在一边是什么意思?你的意思是:我可以把我的动画放在我的 Inspector 窗口中吗?还是我从检查器窗口控制我的动画?好吧,无论哪种方式,我都不使用检查器窗口进行动画,因为我没有使用动画组件,而是使用动画器窗口和混合树。感谢您回复虽然 【参考方案1】:

您不应在 FixedUpdate 中使用 输入 值。您应该将它存储在 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);
    

【讨论】:

感谢您的回复(抱歉耽搁了)。我已经尝试了您的建议,并且效果很好。谢谢,我的动画不是通过鼠标移动播放的,但是当我点击一个位置时它也不会播放!我该怎么办,再次抱歉这么晚重播!!!再次感谢您。 谢谢它完美的工作。我对其进行了一些更改,以便我的玩家可以向所有 4 个方向移动。我现在唯一的问题是我的 LastMoveX 和 LastMoveY 运行不正常。我的意思是,当我在移动过程中向右单击时,我的玩家会向左翻转一点,然后再向右翻转,然后一旦到达最后一个位置,它就会面向左侧而不是右侧。它也做同样的事情,但是当我单击左侧时。我遇到的另一个问题是沿 Y 轴移动。当我点击我的播放器下方时,我的动画不会停止,直到我点击上方使其停止。 我将此添加到我的 void 更新中: var motionDirection = (target - transform.position).normalized; anim.SetFloat("SpeedX", motionDirection.x); anim.SetFloat("SpeedY", motionDirection.y); void FixedUpdate () float LastInputX = transform.position.x - target.x;浮动 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 ("LastMoveY", 1f); else if (LastInputY

以上是关于点击移动动画不起作用的主要内容,如果未能解决你的问题,请参考以下文章

wpf 动画 - 鼠标按下事件不起作用

removeAllAnimations 不起作用后添加动画

为啥我的左右移动动画不起作用?

UIView 开始动画不起作用

动画功能不起作用

Vue.js:转换动画在点击时不起作用