我可以让同一个元素在列表中重复多次吗?



提前致谢。所以我是一个Unity开发者,我有一个AI角色的空闲状态列表。目前,我通过我的检查器中的公共列表控制执行顺序,但是当我试图在执行顺序中第二次执行相同的元素时,我的列表在循环中卡住了重复元素和下一个元素之间,并且没有通过我的其余元素运行。

我应该张贴我的列表脚本吗?再次感谢大家。

public class Idle : MonoBehaviour
{
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
};

private void FixedUpdate()
{
if (Time.timeSinceLevelLoad > prevIdleStateChangeTime + currentStateDuration)
{
int i = availableIdleStates.FindIndex(x => x.Equals(currentIdleState))+1;
//i %= availableIdleStates.Count;
if (i >= availableIdleStates.Count)
{
i = 0;
//TODO: Shuffle available states list 
}
changeState(availableIdleStates[i]);
}
switch (currentIdleState)
{
case IdleState.BasicIdle:
if (Time.timeSinceLevelLoad > subStateChangeTime + subStateDuration)
{
subStateDuration = Random.Range(20f, 30f);
Debug.Log(subStateDuration);
int randInt = Random.Range(0, 1);
subStateChangeTime = Time.timeSinceLevelLoad;
switch (randInt)
{
case 0:
CurrentMovingState = Moving.MovingState.MoveAndRotateToTarget;
return;
case 1:
CurrentMovingState = Moving.MovingState.MoveAndRotateToTarget;
return;
//case 2:
//   CurrentMovingState = Moving.MovingState.MoveAndRotateToTargetWithRotation;
//    return;
}
}
return;

这个方法在每次状态改变时被调用

private void changeState(IdleState NewState)
{
currentIdleState = NewState;
prevIdleStateChangeTime = Time.timeSinceLevelLoad;
subStateChangeTime = Time.timeSinceLevelLoad;
subStateDuration = -1;
}
private enum states
{
state1,
state2
}
private states current;

private void stateChanged()
{
switch (current)
{
case states.state1:
break;
case states.state2:
break;
default:
break;
}
}

上面的代码示例显示了如何使用带有switch case语句的枚举来根据当前状态执行特定的代码,因此您将首先设置当前状态current = states.state1;,然后调用stateChanged方法,该方法将执行正确的代码。

你也不需要一个所有状态的列表,如果你只是想让程序按照它们设置的顺序循环,例如从state1到state2,你可以简单地通过在达到一定的时间限制后设置当前current = (states)(int)current + 1;来实现。