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