【问题标题】:C# - Unity crashes with this code - creating Transform array based on GameObject tagC# - Unity 使用此代码崩溃 - 基于 GameObject 标签创建变换数组
【发布时间】:2016-11-15 10:45:06
【问题描述】:

我在 3D 环境中工作,这是一栋有 16 个房间的房子。在每个房间中,我放置了一个带有名为“RoomsToScanTag”标签的隐形立方体。我正在使用一个名为 Behavior Designer 的资产,在我的检查器中,我给出了要查找的标记名(在本例中为“RoomsToScanTag”)。有了这个标记名,我希望机器人先去 room1,然后继续去 room2,直到 room16。

这是我的代码

using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;

public class MoveTowardsNew : Action
{
    private Transform[] roomsToScanHAHA;
    public string targetTagRooms;
    public Transform targetyo;
    int i = 0;
    int controlNumber = 0;

    public override void OnAwake()
    {
        var targets = GameObject.FindGameObjectsWithTag (targetTagRooms);
        roomsToScanHAHA = new Transform[targets.Length];
        for (int i = 0; i < targets.Length; i++) {
            roomsToScanHAHA [i] = targets [i].transform;
        }
    }

    public override TaskStatus OnUpdate()
    {
        while (controlNumber < roomsToScanHAHA.Length)
        {
            targetyo = roomsToScanHAHA [controlNumber];
            if (Vector3.SqrMagnitude (transform.position - targetyo.position) < 0.5f)
            {
                if (controlNumber < roomsToScanHAHA.Length) {
                    controlNumber++;
                }
                return TaskStatus.Success;
            }
        }
        NavMeshAgent agent = GetComponent<NavMeshAgent> ();
        agent.destination = targetyo.position;
        return TaskStatus.Running;
    }
}

我的问题

Unity 崩溃...它与这段代码有关,我无法弄清楚。有人知道出了什么问题吗?

这是我正在处理的图像:

提前致谢!

【问题讨论】:

    标签: c# unity3d 3d behavior


    【解决方案1】:

    像往常一样,while loop 没有终止:

        while (controlNumber < roomsToScanHAHA.Length)
        {
            targetyo = roomsToScanHAHA [controlNumber];
            if (Vector3.SqrMagnitude (transform.position - targetyo.position) < 0.5f)
            {
                if (controlNumber < roomsToScanHAHA.Length) {
                    controlNumber++;
                }
                return TaskStatus.Success;
            }
        }
    

    第一次运行:controlNumber = 0;

    假设您在数组roomsToScanHAHA 中的第一个元素不符合条件:(Vector3.SqrMagnitude (transform.position - targetyo.position) &lt; 0.5f)controlNumber 不会增加,并且会继续检查第一个元素的条件。这会导致无限循环。

    所以你可以把你的代码改成这样:

        while (controlNumber < roomsToScanHAHA.Length)
        {
            targetyo = roomsToScanHAHA [controlNumber];
            if (Vector3.SqrMagnitude (transform.position - targetyo.position) < 0.5f)
            {
                return TaskStatus.Success;
            }
            controlNumber++;
        }
    

    希望对你有帮助

    【讨论】:

    • 非常感谢!有效。但是,不知何故,它没有向第一个目标移动。它移动到房子的另一个位置(由于某种原因靠近 Room4)而不是第一个 Room1。我究竟做错了什么?代码是一样的,有你的建议。
    • 如果您的第一个目标不够接近,它会检查下一个目标,依此类推,直到找到更接近的目标(在这种情况下,我假设为 Room4)。请接受此答案并创建一个新问题,其中包含更多详细信息,说明您想要实现的目标。如果您也从场景视图中添加一些屏幕截图会更好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多