如何使复选框在编辑器模式和游戏运行时也生效



>我有 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--;
        }
    }

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

不要选择只能选择其中一个的多个复选框,只需使用枚举。 Unity 将为您提供一个下拉菜单,您可以选择三种可用状态之一。

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

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

最新更新