我对团结和编码有点新意,所以我很抱歉愚蠢的错误,而不是使用适当的语言来描述事物。
我试图制作一个2D射击游戏,子弹像弹跳一样弹出墙壁。我创建了一个Ray指向子弹的方向,然后测试该光线是否与墙壁发生碰撞,我不得不在墙壁上创建一个三维盒子对撞机,因为光线无法检测到2d对撞机。现在我试图使用Vector3.reflect来改变子弹的旋转,这样它就会像弹跳一样反弹,而是反弹到随机方向,有时会穿过箱子碰撞器。 我只是想知道问题出在哪里,是代码还是场景设置?如果有人有一些建议,小费甚至批评,我会很感激。谢谢。
这是附加到bullet void Update(){
的代码 Vector3 fwd = transform.TransformDirection(Vector3.up);
//Debug.DrawRay(raycastObject.transform.position, fwd * raySize, Color.green);
RaycastHit hit;
Ray ray = new Ray (transform.position , fwd * raySize ) ;
Debug.DrawRay (transform.position, fwd * raySize);
if (Physics.Raycast (ray , out hit, raySize )) {
Debug.Log ("Bouce test 1 ");
if (hit.collider.tag == "Wall") {
Debug.Log ("Bounce test 2 ");
Vector3 reflectDir = Vector3.Reflect (ray.direction , hit.normal);
float rot = Mathf.Atan2 (reflectDir.y, reflectDir.x) * Mathf.Rad2Deg;
transform.eulerAngles = new Vector3 (0, 0, rot);
}
这是子弹移动的代码
Vector3 pos = transform.position;
Vector3 velocity = new Vector3 (0, speed * Time.deltaTime, 0);
pos += transform.rotation * velocity;
transform.position = pos;
答案 0 :(得分:1)
在我看来,你的问题与这样一个事实有关,即这是一个关于你在3D空间工作的事情的真正方法,然后使用2D空间函数计算你的转换,然后最后只在一个维度上进行旋转(一个维度到极坐标,明显在笛卡尔空间中为2)。出于相关原因,您已经发现需要使用3D盒子对撞机而不是2D兄弟来获得您想要的结果。使用3D对象构建时,请尝试坚持使用3D功能和其他3D功能。混合维度会使事情变得非常复杂,并且可能导致难以阅读的代码和难以解决的问题。
您的解决方案实际上取决于您尝试对游戏进行的操作。在完全3D游戏中,通过各种2D方法进行空间计算只会成为一种灾难。对于由3D对象组成的有效2D游戏,使用3D功能编程反射矢量仍然更简单,并且如果必要,由于3D几何体从游戏区域倾斜,然后将结果投影到2D平面游戏中然后根据需要对其进行标准化和/或缩放。
假设没有复杂的几何图形,您应该可以替换它:
Vector3 reflectDir = Vector3.Reflect (ray.direction , hit.normal);
float rot = Mathf.Atan2 (reflectDir.y, reflectDir.x) * Mathf.Rad2Deg;
transform.eulerAngles = new Vector3 (0, 0, rot);
用这个:
Vector3 reflectDir = Vector3.Reflect (ray.direction , hit.normal);
transform.rotation.SetFromToRotation(ray.direction, reflectDir);
试一试。如果由于倾斜的3D几何结构之后你需要在平面上投射物体让我知道,我会尝试一起破解一些东西来为你修复它。
答案 1 :(得分:1)
再次在Unity 2D教程中,这看起来非常精确地概述了您可能需要使用的效果类型:
https://unity3d.com/learn/tutorials/modules/beginner/2d/sliding-bouncing-2d?playlist=17093
你必须重新开始,但看起来“反弹”包含在2D对撞机中,所以你只需要打开该功能并调高反弹以获得你想要的弹跳。但是,我自己也没有使用Unity 2D,所以我可能错了。
答案 2 :(得分:0)
"我试图制作一个二维射击游戏,子弹像弹跳一样弹出墙壁。"
此外,如果您希望这是严格的2D,您可以通过使用各种Unity 2D对象,函数和变量(如Vector2而不是Vector3)来大大简化您的生活,此时您正在尝试的2D碰撞器之类的东西使用应该是可用的(和你切换到的3D盒子对撞机一样)。
我对Unity不太好,并且根本没有玩过Unity2D,但是从你想要做的事情来看,Unity2D会让你的生活变得更轻松。您可能希望在此处查看其文档和教程:
https://unity3d.com/learn/tutorials/topics/2d-game-creation
尝试使用完全3D工具/变量/函数进行2D操作只是一个不必要的额外复杂层。这就像试图沿着一条公路飞越地面,穿过一个复杂而拥挤的城市,而不是仅仅驾驶汽车而是开车。如果你不想摆脱一个你不需要的维度,那就会让事情变得更加复杂。