【问题标题】:Playing a random animation every time an object passed每次物体经过时播放随机动画
【发布时间】:2019-03-04 22:08:32
【问题描述】:

我目前正在制作游戏,并且我正在尝试让镜子在玩家走过时播放随机动画。我设法让它工作,有点,但遇到了一些麻烦。

所以首先我创建了一个空闲动画以及三个随机动画,当玩家从空闲动画中经过和离开时激活这些动画。然后,我创建了一个简单的过渡到三个状态中的每一个,并保留标准退出时间和过渡持续时间。我创建了这个脚本来尝试激活动画:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mirrorActivate : MonoBehaviour
{
    private GameObject FSSecurity;
    public GameObject mirrorblank;
    public List<AnimationClip> anim = new List<AnimationClip>();
    // Start is called before the first frame update
    private void Awake()
    {

    }
    void Start()
    {
        FSSecurity = GameObject.Find("Female Security");
    }

    // Update is called once per frame
    void Update()
    {
        if (FSSecurity.transform.position.x == 10)
        {
            StartAnimation();
        }
    }
    public void StartAnimation()
    {
        int random = Random.Range(0, anim.Count);
        mirrorblank.GetComponent<Animator>().Play(anim[random].name);
    }
}

工作原理:每次玩家走到这个位置时,它似乎都会播放一个随机动画。

什么不工作?: 1.进入场景idle动画立即触发三个动画之一,不激活if语句。 ((它应该处于空闲状态,并且如果 if() 为真,则仅随机切换到三个之一)) 2. 由于浮点精度使用 == 不实用,如果我使用带有 = 而不是 == 的范围,理论上可以解决此问题。但是,如果有更好的解决方案来激活传递对象的玩家,我愿意接受建议。 3. 随机播放的动画没有完全播放动画应该持续的完整时间。 4. 激活后的最后一个问题,直到下次激活它们才会返回空闲状态。

我在寻找什么:每次用户走过经过的对象并在完成返回空闲时播放随机动画。附带说明一下,是否有一种更有效的方法可以知道玩家何时通过对象(我使用的是 2D)

(出于某种原因,我不让我在帖子上贴上 unity2d 标签)

之间的简单转换,没有设置触发器或任何东西

【问题讨论】:

  • 能否请您粘贴您的动画控制器的屏幕截图,以便我们查看您的过渡策略?
  • “将转换引入空闲状态会产生其他问题”是什么意思?
  • @AlexMyers 我刚刚更新了最后一次的问题。请检查上方以查看最终编辑。那是我犯的一个错误,我也改变了代码中的一个东西,忘记了我认为指向空闲状态的转换是导致它的原因

标签: unity3d animation


【解决方案1】:

终于!经过一些漫长而曲折的转弯后,我终于想出了一个我认为效果很好的合理解决方案。

问题1解决方案:
为了防止在 if() 语句触发之前触发任何动画,请删除从空闲到随机状态的转换。

问题2解决方案:
只需使用范围来解决使用 == 比较浮点精度的问题。请评论任何其他更好的解决方法。

问题3解决方案:
由于不断触发,动画并未完全按照所需的动画时间运行。如果玩家 >= 10 是导致它激活的唯一参数,因此要使用布尔值的简单解决方案来解决。如果 player.transform >= 10 并且布尔值为 true 开始动画。如果玩家在范围之外,则布尔值为假。在 StartAnimation() 中设置布尔值太真实。

问题4解决方案:
现在移除了从空闲到随机动画的过渡,而是创建从随机状态到退出的过渡。不需要在空闲动画和随机动画之间进行交互的过渡。

完整代码以获得更好的细节:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mirrorActivate : MonoBehaviour
{
    private GameObject FSSecurity;
    public GameObject mirrorblank;
    public List<AnimationClip> anim = new List<AnimationClip>();
    bool isPlayingAlready = false;
    // Start is called before the first frame update
    private void Awake()
    {

    }
    void Start()
    {
        FSSecurity = GameObject.Find("Female Security");
    }

    // Update is called once per frame
    void Update()
    {
        if (FSSecurity.transform.position.x >= 10 && isPlayingAlready == false)
        {
            StartAnimation();
        }
        if (FSSecurity.transform.position.x <= 10 && isPlayingAlready == true)
        {
            isPlayingAlready = false;
        }
    }
    public void StartAnimation()
    {
        int random = Random.Range(0, anim.Count);
        mirrorblank.GetComponent<Animator>().Play(anim[random].name);
        isPlayingAlready = true;
    }
}

动画控制器视图:

动画过渡视图(这可能会根据您的需要而改变,但出于此目的..):

我希望这对可能遇到同样问题的人有所帮助,这可以通过任何你用来激活随机动画的东西来完成,无论是碰撞还是其他。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多