C# Unity Destroy和其他代码不起作用?

C# Unity Destroy和其他代码不起作用?,c#,unity3d,C#,Unity3d,我正在尝试制作一款Snake游戏,我正在尝试让apple的功能正常工作。这个脚本的目的是,每当我的蛇经过苹果时,苹果就会消失,并在屏幕上的任意位置重新出现。但它却什么也没做,你知道为什么吗 附言:相机的尺寸是10,纵横比是16:9,这就是为什么我有一些奇怪的随机范围值。我还使用了Debug.Log-in-Update来确保变量工作,是的,每当我的snake移动坐标时,它都会工作 public class Apple_RandomSpawn : MonoBehaviour { privat

我正在尝试制作一款Snake游戏,我正在尝试让apple的功能正常工作。这个脚本的目的是,每当我的蛇经过苹果时,苹果就会消失,并在屏幕上的任意位置重新出现。但它却什么也没做,你知道为什么吗

附言:相机的尺寸是10,纵横比是16:9,这就是为什么我有一些奇怪的随机范围值。我还使用了Debug.Log-in-Update来确保变量工作,是的,每当我的snake移动坐标时,它都会工作

public class Apple_RandomSpawn : MonoBehaviour
{
    private Vector2 foodPos;
    private Snake_Move snakeMove;

    void Start()
    {
        SpawnApple();
    }

    public void Update()
    {
        transform.position = new Vector2(foodPos.x, foodPos.y);
        SnakeAte();
    }

    public void SpawnApple()
    {
        foodPos = new Vector2(Random.Range(-17, 17), Random.Range(-9, 9));
    }

    public void SnakeAte()
    {
        if (Mathf.Approximately(foodPos.x, snakeMove.pos.x) && Mathf.Approximately(foodPos.y, snakeMove.pos.y))
        {
            SpawnApple();
        }
    }
}

首先,它与您的问题没有直接关系,但不要将
GetComponent()
GameObject.Find()
放在
Update()
函数中。这两个函数,尤其是
GameObject.Find()
函数是超重的,因此建议您在
Start()
Awake()
内调用这类函数,或者在初始化类时调用。它会直接严重影响游戏的性能,因此我的建议如下:

[序列化字段]
私人蛇行蛇行;
并通过Inspector拖动游戏对象(附加了蛇头组件)。您应该首先考虑这种方式,而不是使用<代码> GAMObj.Fund()/代码>和<代码> GETCuffeTeNe()/<代码> < /P> 第二,
Float
不建议通过
=
直接比较等式,因为必须存在舍入误差。有一个帮助函数,用于比较两个统一的浮点值,如
Mathf.about(float a,float b)
。通过
=
直接比较两个
float
值几乎总是不能像您想象的那样工作

第三,代码中似乎没有
Instantiate()
函数,但您尝试使用一个apple对象,每次使用它时,只需更改它的位置即可。那么为什么
Object.Destroy(gameObject)
存在呢?你所做的是,当你第一次得到苹果的时候,把它毁掉。我认为您必须删除
Destroy()
函数,并且
spawneapple()
更改apple的目标坐标,并且位置将在
Update()
函数中更新

而且无需间接设置目标位置,并在
update()
函数中对其进行更新。您可以直接设置apple的位置,如:

//假设你遵循了我上面关于蛇行的建议。
公共无效更新()
{
蛇();
调试日志(snakeMove.pos);
}
公共空间(苹果)
{
transform.position=新向量2(Random.Range(-17,17),Random.Range(-9,9));
}
公蛇
{
如果(foodPos==蛇移动位置)
{
产卵苹果();
}
}

首先,您最后一条评论中的空引用来自: 私人蛇行蛇行 它是一个私有变量,从未赋值。您需要将其公开/[SerialistField]并在inspect中分配它,或者使用某种初始化函数为其赋值

对于命中检测,如果您想检查两个浮点数是否完全相同,那么Mathf.approxist很好。如果你正在检查移动对象的两个位置,那么它们完全相同的可能性非常低,这可能取决于帧速率等。保留您的实现,您可以检查两个位置之间的最小距离。您可以调整距离_阈值以获得更适合自己的值

public class Apple_RandomSpawn : MonoBehaviour
        {
            private const float DISTANCE_THRESHOLD = 0.1f;
            private Vector2 foodPos;
            private Snake_Move snakeMove;

            void Start()
            {
                SpawnApple();
            }

            public void Update()
            {                   
                SnakeAte();
            }

            public void SpawnApple()
            {
                foodPos = new Vector2(Random.Range(-17, 17), Random.Range(-9, 9));
                transform.position = new Vector2(foodPos.x, foodPos.y);
            }

            public void SnakeAte()
            {
                if (Vector3.Distance(foodPos, snakeMove) < DISTANCE_THRESHOLD)
                {
                    SpawnApple();
                }
            }
        }
公共类苹果随机繁殖:单一行为
{
专用常量浮动距离\u阈值=0.1f;
私有向量2 foodPos;
私人蛇行蛇行;
void Start()
{
产卵苹果();
}
公共无效更新()
{                   
蛇();
}
公共空间(苹果)
{
foodPos=newvector2(Random.Range(-17,17),Random.Range(-9,9));
transform.position=newvector2(foodPos.x,foodPos.y);
}
公蛇
{
if(矢量3.距离(foodPos,snakeMove)<距离\阈值)
{
产卵苹果();
}
}
}

现在请记住,由于你将苹果传送到一个纯粹随机的位置,它可能会传送回你的蛇身上:)。

Vector2的
x
y
浮动的。我猜
foodPos.x
类似于
0.121
,而
snakeMove.pos.x
类似于
0.1213
之类的东西。我建议使用调试器进行调试。然后我是否应该添加某种舍入组件?导致蛇每1/60秒在x值上移动0.1,这使蛇的移动成为浮动。我不知道如何解决这个问题。如果是这个问题,我可能会检查它们之间的距离是否小于某个数字。还要注意的是,浮点数不能准确地表示所有的小数,就像我们不能在10进制中准确地表示1/3一样。有关详细信息,请参阅。@John我更改了Debug.Log以显示foodPos-snakeMove.pos,并且我得到了非常小的0.1s值,所以是的,我认为你是对的。哦,我的天哪,我可以一直调用一个变量?!!?!我花了大约30分钟试图从另一个类lmao调用一个变量GameObject的意义是什么。然后查找?@CodingMike是的,你所做的是扫描整个场景,找到名为“蛇头”的GameObject,然后尝试获取组件
Snake\u Move
。这并不是什么大问题,但当你尝试每秒做60次时,它就成了问题;近似数学(foodPos.x,snakeMove.p