Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OnTiggerEnter2D调用不一致_C#_Unity3d_Physics_Unity3d 2dtools - Fatal编程技术网

C# OnTiggerEnter2D调用不一致

C# OnTiggerEnter2D调用不一致,c#,unity3d,physics,unity3d-2dtools,C#,Unity3d,Physics,Unity3d 2dtools,显示冲突不一致的gif: 在我的Unity2D游戏中,我有一个弹弓(玩家)向墙上发射弹珠(思考型益智射击游戏)。每个大理岩都是预制体的克隆体,每个预制体都有一个刚体,并检查了运动学,以及一个环形采集器,检查了OnTrigger 当大理石与两侧墙碰撞时,我使用OnTriggerEnter2D()并旋转角度,使其以一定角度从墙上反弹。当大理石与顶墙碰撞时,它基本冻结,此时我移除刚体组件并设置“TopObject”标记 当一个大理石与另一个大理石碰撞时,会出现不一致。有时调用触发器函数,有时则不调用。

显示冲突不一致的gif:

在我的Unity2D游戏中,我有一个弹弓(玩家)向墙上发射弹珠(思考型益智射击游戏)。每个大理岩都是预制体的克隆体,每个预制体都有一个刚体,并检查了运动学,以及一个环形采集器,检查了OnTrigger

当大理石与两侧墙碰撞时,我使用OnTriggerEnter2D()并旋转角度,使其以一定角度从墙上反弹。当大理石与顶墙碰撞时,它基本冻结,此时我移除刚体组件并设置“TopObject”标记

当一个大理石与另一个大理石碰撞时,会出现不一致。有时调用触发器函数,有时则不调用。触发因素似乎是随机和不可预测的

下面是我的C代码,用于检测碰撞及其伴随的行为(附在大理石上):

使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
公共类RockMove:单一行为
{
公共浮子速度=0.5f;
私有向量2方向=新向量2(0,1);
//电流角
私人浮标;
//索引角
私人浮动角度b;
//转速
私人漂浮物腐烂;
//弯曲速度
私人浮动rotMod;
//当大理石与墙碰撞时停止
private bool IsMoving=真;
void Start(){
}
无效更新()
{
如果(正在移动){
rot=RockSpawn.rot;
currentAngleZ=transform.eulerAngles.z;
rotMod=变换位置x*-0.5f;
//向前移动+增加速度
转换。转换(方向*时间。时间*速度,空间。自我);
//弯曲的
旋转(0,0,rotMod,Space.Self);
if(transform.position.x>=0){
//靠近墙壁时速度更快“重力/磁力”
速度+=变换.position.x*8*Time.deltaTime;
}
if(变换位置x<0){
//靠近墙壁时速度更快“重力/磁力”
速度+=变换.position.x*-8*Time.deltaTime;
}
}
否则{
//当物体静止时
速度=0;
}
}
void OnTriggerEnter2D(碰撞的R2D碰撞器){
//如果与另一个大理石碰撞
if(collider.gameObject.tag==“拓扑对象”){
//摆脱刚体
//两个对象碰撞时不能有两个刚体
破坏(刚体2d);
//冻结运动
IsMoving=假;
Log(“您与大理石碰撞”);
//冻结旋转
this.transform.Rotate(0,0,0,Space.Self);
//分配新标记
this.tag=“拓扑对象”;
}
else if(collider.name==“TopWall”)
{
破坏(刚体2d);
IsMoving=假;
Log(“你打破了第四堵墙!”);
变换。旋转(0,0,0);
this.tag=“拓扑对象”;
}
否则{
//从墙上弹下来
currentAngleZ=transform.eulerAngles.z;
角度B=360-(2*当前角度Z);
变换。旋转(0,0,角度B);
}
}
}
更新:简单地将Update()函数更改为FixedUpdate()似乎可以使触发器更加一致,但是在检测它们的方式上仍然存在不一致

我测试了rigidbody2d.velocity、transform.position和其他各种变换函数,但transform.Translate通过将对象从墙上弹起产生了最佳效果,尽管理论上它只是将对象传送到一个新位置


降低速度也不会影响一致性,更改圆碰撞器的大小也不会影响一致性。

无论是否使用物理,OnTriggerEnter2D都应始终工作

然而,如果一个游戏对象与另一个游戏对象保持联系,你只会在它们发生碰撞的第一刻将OnTiggerEnter标记一次。之后,通过调用OnTiggerStay,您可以随时了解两个游戏对象是否仍在碰撞

然后在他们停止碰撞后,OnTriggerCenter将重置,并在接触其他游戏对象时再次触发,即使它与之前的碰撞完全相同。你检查过这个了吗


希望能有所帮助,我会发表评论,但我没有足够的声望点,所以不得不发表回复,如果我不应该的话,我很抱歉。

这里有两件显而易见的事情:

1.)你的游戏对象有一个刚体2D,因此你不应该通过变换移动它,而是通过刚体移动,函数如下:

rigidbody2D.MovePosition()

只需在Unity文档中查找它们

2)把这些都放进

void FixedUpdate()
{
    ...
}
这就是有关物理引擎的一切。
还有大量的在线资源可供阅读:)

据我所知,运动学刚体在2D中不会碰撞。我还是个新手,但我在一些关于我自己问题的答案中发现了这一点。你应该更深入地研究它。

根据我的经验,当使用基于物理的运动时,碰撞和触发事件更加一致,例如,
刚体.速度
。我认为问题与你的墙壁有关。当气泡在墙上反弹时,gif仅显示碰撞不一致。你的墙是作为触发器设置的,还是只是普通的碰撞器?墙也是作为触发器设置的(选中了IsTrigger的多边形碰撞器)。我刚才看到了关于你的对象是运动学的注释。我想这可能是真正的原因。谢谢你,我会试着留下来告诉你
rigidbody2D.MoveRotation()
void FixedUpdate()
{
    ...
}