我怎样才能使复选框在编辑器模式和游戏 运行 时也生效?

How can i make the checkboxes to effect also in editore mode and when the game is running?

我有 3 个复选框

public bool stateForward = false, stateReverse = false, stateRandom = false;

我希望我每次只能选择一个复选框。但也在编辑器模式下以及游戏为 运行 时。当游戏是 运行 我想让它影响游戏。

在我添加的脚本顶部:

[ExecuteInEditMode]

我尝试在开始功能中做

void Start()
    {
        while (true)
        {
            if (stateForward == true)
            {
                stateRandom = false;
                stateReverse = false;
            }
            else if (stateReverse == true)
            {
                stateRandom = false;
                stateForward = false;
            }
            else if (stateRandom == true)
            {
                stateForward = false;
                stateReverse = false;
            }
        }
        anims = GetComponent<Animations>();
        waypoints = GameObject.FindGameObjectsWithTag("ClonedObject");
        objectsToMove = GameObject.FindGameObjectsWithTag("Robots");
        originalPosition = objectsToMove[0].transform.position;
    }

但我正在运行动画:检测到无法访问的代码 在更新函数中:

void Update()
    {
        if (MyCommands.walkbetweenwaypoints == true)
        {
            DrawLinesInScene();
            anims.PlayState(Animations.AnimatorStates.RUN);
            WayPointsAI();
        }
    }

在 WayPointsAI 中

private void WayPointsAI()
    {
        if (stateForward == true)
        {
            if (targetIndex == waypoints.Length)
                targetIndex = 0;
        }
        if (stateReverse == true)
        {
            if (targetIndex == 0)
                targetIndex = waypoints.Length;
        }
        waypoint = waypoints[targetIndex].transform;
        float distance = Vector3.Distance(objectsToMove[0].transform.position, waypoint.transform.position);
        objectsToMove[0].transform.rotation = Quaternion.Slerp(objectsToMove[0].transform.rotation, Quaternion.LookRotation(waypoint.position - objectsToMove[0].transform.position), rotationSpeed * Time.deltaTime);

        //move towards the player
        if (distance < 30)
        {
            objectsToMove[0].transform.position += objectsToMove[0].transform.forward * slowDownSpeed * Time.deltaTime;
        }
        else
        {
            objectsToMove[0].transform.position += objectsToMove[0].transform.forward * moveSpeed * Time.deltaTime;
        }
        if (distance < 2)
        {
            if (stateForward == true)
                targetIndex++;
            if (stateReverse == true)
                targetIndex--;
        }
    }

如果您希望它们是互斥的,您可能应该使用一个 enum 字段而不是三个 bool 字段。您的枚举将具有值 ForwardReverseRandom,而您的 MonoBehavior 将具有您的枚举类型的单个字段。这确保在任何给定时间都只会选择一个,并且编辑器应该显示一个下拉列表来选择哪个值而不是一系列复选框。这不仅修复了编辑器 UI 问题,而且还会导致代码更清晰,潜在错误更少。

首先,您永远无法摆脱 Start() 方法。你有一个永远无法突破的 while(true) 循环,所以你会被困在那里。

不要使用只能选择其中一个的多个复选框,而是使用枚举。 Unity 会给你一个下拉菜单,你可以从三种可用状态中选择一种。

enum MyStateEnum{ Forward, Reverse, Random } public MyStateEnum State;