提前致谢。我是一名Unity开发者。因此,我将枚举中的AI状态转换为列表。
public enum IdleState
{
BasicIdle,
PlayingWithKids,
Playfull,
Curious,
Bored,
MoveToCamera,
Waiting,
PlantMode,
Shy,
Crying
}
public List<IdleState> availableIdleStates = new List<IdleState>()
{
IdleState.BasicIdle,
IdleState.PlayingWithKids,
IdleState.Playfull,
IdleState.Curious,
IdleState.Bored,
IdleState.Waiting,
IdleState.PlantMode,
IdleState.Shy,
IdleState.Crying
};
我通过我的检查器中的公共列表控制执行顺序,但是我想在我的检查器执行顺序中多次执行基本空闲(enum int = 0)。虽然当列表到达我的第二个基本空闲时,它会重新启动并卡在两个基本空闲之间,我认为这是因为它在enum中的值是0,但我真的不知道是什么导致了这一点,任何帮助都是一种祝福。谢谢你们了!
private void FixedUpdate()
{
if (Time.timeSinceLevelLoad > prevIdleStateChangeTime + currentStateDuration)
{
int i = availableIdleStates.FindIndex(x => x.Equals(currentIdleState))+1;
if (i >= availableIdleStates.Count)
{
i = 0;
}
changeState(availableIdleStates[i]);
}
switch (currentIdleState)
{
case IdleState.BasicIdle:
if (Time.timeSinceLevelLoad > subStateChangeTime + subStateDuration)
{
subStateChangeTime = Time.timeSinceLevelLoad;
switch (randInt)
{
//something
}
}
break;
case IdleState.PlayingWithKids:
if (Time.timeSinceLevelLoad > subStateChangeTime + subStateDuration)
{
int randInt = Random.Range(0, 3);
subStateChangeTime = Time.timeSinceLevelLoad;
switch (randInt)
{
//something
}
}
break;
等。
每次状态改变,这个方法都会被调用:
private void changeState(IdleState NewState)
{
currentIdleState = NewState;
prevIdleStateChangeTime = Time.timeSinceLevelLoad;
mover.resetParameters();
subStateChangeTime = Time.timeSinceLevelLoad;
subStateDuration = -1;
}
availableIdleStates.FindIndex(x => x.Equals(currentIdleState))
。如果第一个和第二个对象是相同的,这将总是发现你的重复状态(id = 0)的第一次出现,你的脚本将其更改为id = 1,但在下一次更新再次发现第一个元素,你的id回到0。如果你想要有重复的元素,你应该为int值设置一个字段,而不是在list上查找索引。