我目前正在制作一个游戏的过程中,我试图让一个镜子播放随机动画,当玩家走过它。我设法让它起作用了,有点,而且有点麻烦。
所以首先,我创建了一个空闲动画,以及三个随机动画,当播放器从空闲的动画中走过时,将被激活。然后,我创建了对这三种状态的简单转换,保留了标准的退出时间和转换持续时间。我创建这个脚本是为了尝试激活动画:
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语句。(如果()是真的话,它应该处于空闲状态,只能随机切换到三个中的一个) 2.由于使用==的浮点精度是不实用的,理论上如果使用<=和>=的范围而不是==,理论上可以解决。但是如果有一个更好的解决方案来激活玩家传递一个对象,我是开放的建议。3.随机播放动画并不能充分发挥动画的全时性。4.激活后的最后一个问题,在下一次激活之前,它们不会返回空闲状态。
我正在寻找的是:随机动画播放,每次用户步行,传递对象,并在它完成返回到空闲。另外,还有一种更有效的方法来了解玩家何时传递对象(我使用的是2D)。
(出于某种原因,我不让我在帖子上贴unity2d标签)
之间的简单转换,没有设置触发器或任何东西
发布于 2019-03-05 10:20:49
终于来了!经过更长时间和扭曲的转弯,我终于想出了一个合理的解决方案,我认为很好。
问题1解决方案:
为了防止任何动画在if()语句被触发之前触发,请删除从空闲状态到随机状态的转换。
问题2解决方案:
使用==比较浮点精度,简单地使用一个量程来解决问题。请评论其他更好的方式来做这件事。
问题3解决方案:
动画没有完全运行他们的过程所需的动画时间,因为不断的触发。如果播放器是>=,则只有10是导致其激活的参数,因此要解决这个问题,可以使用布尔值的简单解决方案。如果player.transform为>= 10,布尔值为真启动动画。如果播放机超出了范围,则布尔值为false。在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;
}
}
动画控制器视图:
动画转换视图(这可能会根据您的需要而改变,但为此目的.):
我希望这能帮助任何人谁可能遭受同样的问题,这可以做任何事,你可以激活随机动画,无论是碰撞或其他东西。
https://stackoverflow.com/questions/54992323
复制相似问题