每次通过物体时播放随机动画

时间:2019-03-04 22:08:33

标签: unity3d animation

我目前正在制作游戏,我试图让镜子在玩家走过时随机播放动画。我设法使其正常工作,并在使用过程中遇到了一些麻烦。

因此,我首先创建了一个空闲动画以及三个随机动画,以便在玩家从空闲动画中走来走去时被激活。然后,我创建了到三个状态中每个状态的简单过渡,而保留了标准退出时间和过渡持续时间。然后我创建了这个脚本来尝试激活动画:

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.进入场景后,空闲动画立即触发三个动画之一,而不会激活if语句。 ((它应该处于空闲状态,并且如果if()为true,则只能随机切换到三个之一)) 2.由于使用==进行浮点精度运算是不切实际的,因此,如果我使用的范围是<=和> =而不是==,则理论上可以解决此问题。但是,如果有更好的解决方案来激活玩家通过一个物体,我可以提出建议。 3.随机播放的动画不能完全播放动画应持续的全部时间。 4.激活后的最后一个问题,直到下一次激活,它们才返回到空闲状态。

我要寻找的是:每次用户走过传递的对象并完成时返回随机播放的随机动画。另外,有一种更有效的方法来知道玩家何时通过物体(我正在使用2D)

(出于某些原因,不允许我在帖子上贴unity2d标签)

enter image description here

简单的过渡,没有设置触发器或任何东西

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

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

问题3解决方案:
由于不断触发,动画未能完全按照所需的动画时间运行。如果播放器> == 10是导致其激活的唯一参数,那么要解决此问题,请使用布尔值的简单解决方案。如果player.transform为> = 10并且布尔值为true,则开始动画。如果玩家超出范围,则布尔值为false。在StartAnimation()中将boolean设置为true。

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

动画控制器视图:

enter image description here

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

enter image description here

我希望这可以帮助可能遇到这些相同问题的任何人,无论您是激活碰撞还是其他任何东西来激活随机动画,都可以使用此方法来完成。