Unity Enum参照で忘れがちなことメモ

EnumでUpdateないの管理をしているとたまに処理が行われないことがあるのでメモしておく。

何回も経験しているはずなのにいまだに引っかかる。
こんな感じで定義してるときに別のスクリプトからCurrentStateを参照して、特定のStateのときに処理を行おうとするとうまくできないことがある。たぶんChangeStateが1フレームで変わってしまって参照が間に合わない?勝手な予想なので間違ってたらすみません。

public class Controller : MonoBehavior{
public static Contorller Instance;


public enum State{
A,
B,
C,
}
public State CurrentState;
private void Awake(){
if(Instance != null){
Destroy(this);
return;
}
Instance = this;
}
void Update(){
UpdateState();
}

private void ChangeState(State state){
CurrentState = state;
}

private void UpdateState(){
switch(CurrentState){
case State.A:
ChangeState(State.B);
break;
case State.B:
ChangeState(State.C);
break;
case State.C:
break;
}
}
}

参照するスクリプト

public class Sansho : MonoBehavior{
void Update(){
CheckState();
}

private void CheckState(){
if(Controller.Instance.CurrentState == Controller.State.A){
Debug.Log("State A");
}
}
}

こんな感じで書いてもCheckStateのDebugが出ないことがある。

Coroutineとかで待つか、ChangeStateの条件を外部にとりつけるかしないといけない。
Coroutineで1秒とか待つ場合はboolを入れておかないと何回も処理が走ってしまったりする。

public class Sansho : MonoBehavior{
bool ForA;
void Update(){
CheckState();
}

private void CheckState(){
if(Controller.Instance.CurrentState == Controller.State.A){
if(!ForA){
Debug.Log("State A");
ForA = true;
}
}
}
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA