【问题标题】:Unity C# - How do I fix this code? [closed]Unity C# - 如何修复此代码? [关闭]
【发布时间】:2017-05-12 15:55:49
【问题描述】:

我从https://forum.unity3d.com/threads/clean-est-way-to-find-nearest-object-of-many-c.44315/复制了一个代码

但是这段代码:

Transform GetClosestCube (Transform[] cubes);

    void GetClosestCube()
    {
        {
            Transform bestTarget = null;
            float closestDistanceSqr = Mathf.Infinity;
            Vector3 currentPosition = transform.position;
            foreach(Transform potentialTarget in cubes)
            {
                Vector3 directionToTarget = potentialTarget.position - currentPosition;
                float dSqrToTarget = directionToTarget.sqrMagnitude;
                if(dSqrToTarget < closestDistanceSqr)
                {
                    closestDistanceSqr = dSqrToTarget;
                    bestTarget = potentialTarget;
                }
            }

            return bestTarget;
        }
    }

它给出了错误:

Assets/Player.cs(29,12):错误 CS0501: `Player.GetClosestCube(Transform[])' 必须有一个主体,因为它是 未标记为抽象、外部或部分

如果我完全按照线程中的方式使用代码:

void GetClosestCube()
    {
        {
            Transform GetClosestCube (Transform[] cubes)
            {
            Transform bestTarget = null;
            float closestDistanceSqr = Mathf.Infinity;
            Vector3 currentPosition = transform.position;
            foreach(Transform potentialTarget in cubes)
            {
                Vector3 directionToTarget = potentialTarget.position - currentPosition;
                float dSqrToTarget = directionToTarget.sqrMagnitude;
                if(dSqrToTarget < closestDistanceSqr)
                {
                    closestDistanceSqr = dSqrToTarget;
                    bestTarget = potentialTarget;
                }
            }

            return bestTarget;
        }
        }
    }

错误:Assets/Player.cs(34,28):错误 CS1525:意外符号 (', expecting,',;', or='

【问题讨论】:

  • 为什么要投反对票?我做错了吗?
  • 我猜你在复制代码之前需要阅读一本 C# 初学者书籍。该代码不是有效的 C#,它试图声明一个方法 Transform GetClosestCube(Transform[] cubes) 在另一个方法中 void GetClosestCube()。这是不可能的(在这里没有任何意义)。您宁愿向代码的作者寻求澄清,
  • @Jip1912:链接中的代码看起来与问题中粘贴的代码不同。

标签: c# unity3d transform


【解决方案1】:

从未使用 Unity 框架进行编程,所以我可能不应该在这里发帖,但是哦,好吧。我同意 Rene 的观点,这看起来不像是有效的 C# 代码。

        Transform GetClosestCube (Transform[] cubes)
        {
            Transform bestTarget = null;
            float closestDistanceSqr = Mathf.Infinity;
            Vector3 currentPosition = transform.position;
            foreach (Transform potentialTarget in cubes)
            {
                Vector3 directionToTarget = potentialTarget.position - currentPosition;
                float dSqrToTarget = directionToTarget.sqrMagnitude;
                if (dSqrToTarget < closestDistanceSqr)
                {
                    closestDistanceSqr = dSqrToTarget;
                    bestTarget = potentialTarget;
                }
            }

            return bestTarget;
        }

对我来说看起来更正确。此方法试图获取最近的 Cube。这意味着您不希望它返回 void (或什么都没有)。您希望您的方法返回您在数组中发送的立方体之一,最好是最接近的。这就是为什么它的返回类型是 Transform(因为那是一个立方体)。

我认为您会希望将此方法包含在与多维数据集有关的类中。

假设这是在一个名为 ReadyPlayerOne 的类中(错误的类名,好书),方法的工作是告诉您最接近 ReadyPlayerOne 实例的多维数据集,您的代码可能如下所示。

public class ReadyPlayerOne {
    Transform GetClosestCube (Transform[] cubes)
    {
        Transform bestTarget = null;
        float closestDistanceSqr = Mathf.Infinity;
        Vector3 currentPosition = transform.position;
        foreach (Transform potentialTarget in cubes)
        {
            Vector3 directionToTarget = potentialTarget.position - currentPosition;
            float dSqrToTarget = directionToTarget.sqrMagnitude;
            if (dSqrToTarget < closestDistanceSqr)
            {
                closestDistanceSqr = dSqrToTarget;
                bestTarget = potentialTarget;
            }
        }

        return bestTarget;
    }
}

然后你可以新建一个实例并像这样调用它。

var playerone = new ReadyPlayerOne();
var closestCube = playerone.GetClosestCube(cubes);

我希望这会有所帮助:)

【讨论】:

  • 但是我不能让脚本处于空白状态? pastebin.com/sJbJvSqf 这给出了一个错误
  • 你可以,但你不会那样构建它。它会更像这样pastebin.com/0hCJQKSq
  • 然后我得到:(9,36):错误 CS0103:当前上下文中不存在名称“立方体”
  • 记住我的代码只是一个例子。如果您想找到最近的立方体,您必须提供一组(数组)立方体以供选择。不知何故,您的代码必须有一个存在的立方体列表/数组。然后这些立方体将被传递给 GetClosestCube 方法。如果您没有多维数据集列表,则必须先创建它们。如果这不起作用,那么您可能需要将此代码扔出窗口并从不同的方法开始。如果您提供更多代码,我可能会提供更多帮助,但基于现有的内容,这是我能做的最好的。
  • 好吧,如果我理解你想要做什么,你正试图让最接近变换对象的立方体。您的方法 FindClosestCube() 看起来它返回最接近的多维数据集。但是你没有引用它。 var mostCube = FindClosestCube();
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2013-09-26
  • 1970-01-01
相关资源
最近更新 更多