首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity Vector3.反射,无法正常工作

Unity Vector3.反射,无法正常工作
EN

Stack Overflow用户
提问于 2015-01-27 20:36:12
回答 3查看 3.2K关注 0票数 1

我对统一和编码有点陌生,所以我很抱歉犯了愚蠢的错误,没有使用适当的语言来描述事物。

我正在尝试制作一款2d射击游戏,里面的子弹像跳弹一样从墙上弹开。我创建了一个指向子弹行进方向的光线,然后测试该光线是否与墙壁发生碰撞,我必须在墙壁所在的位置创建一个3d盒对撞器,因为光线不会检测到2d对撞器。现在我尝试使用Vector3.reflect来改变子弹的旋转,这样它就会像跳弹一样反弹,但它会反弹到随机的方向,有时还会穿过盒子对撞机。我只想知道问题出在哪里,是代码还是场景设置?如果有人有什么建议、建议甚至批评,我将非常感谢.thanks

下面是附加到bullet void Update () {)的代码

代码语言:javascript
复制
    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);

                }

这是子弹移动的代码

代码语言:javascript
复制
       Vector3 pos = transform.position; 
       Vector3 velocity = new Vector3 (0, speed * Time.deltaTime, 0); 
       pos += transform.rotation * velocity;
       transform.position = pos; 
EN

回答 3

Stack Overflow用户

发布于 2015-12-12 03:56:16

在我看来,你的问题与这样一个事实有关,那就是你在3D空间工作时,使用2D空间函数来计算变换,最后只在一维上进行旋转(极坐标为一维,笛卡尔空间中显然是2维)。由于相关的原因,您已经发现需要使用3D盒子对撞机而不是2D近亲来获得您想要的结果。当使用3D对象进行构建时,尝试使用3D功能,以及其他3D内容。混合维度将使事情变得非常复杂,并可能导致难以阅读的代码和变得难以解决的问题。

你的解决方案实际上取决于你试图用你的游戏做什么。在全3D游戏中,通过各种2D方法进行空间计算将是一种灾难。对于由3D对象组成的有效2D游戏,使用3D函数编程反映您的向量仍然会更简单,如果需要,由于3D几何体倾斜出游戏领域,然后将结果投影到2D游戏平面,然后根据需要对其进行规格化和/或缩放。

假设没有复杂的几何体,您应该能够替换以下内容:

代码语言:javascript
复制
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);

有了这个:

代码语言:javascript
复制
Vector3 reflectDir = Vector3.Reflect (ray.direction , hit.normal);
transform.rotation.SetFromToRotation(ray.direction, reflectDir);

试一试。如果你需要投影的东西在平面后,由于倾斜的3D几何让我知道,我会试着破解一些东西,以修复它为你。

票数 1
EN

Stack Overflow用户

发布于 2015-12-12 04:18:11

同样,在Unity 2D教程中,这看起来像是您可能需要使用的效果类型的一个很好的概述:

https://unity3d.com/learn/tutorials/modules/beginner/2d/sliding-bouncing-2d?playlist=17093

你将不得不重新开始,但它看起来“反弹”包括在2D对撞机中,所以你只需打开该功能并打开反弹来获得你想要的弹跳。再说一次,我自己也没有使用过Unity 2D,所以我可能会弄错。

票数 1
EN

Stack Overflow用户

发布于 2015-12-12 04:07:47

“我正在尝试制作一款2d射击游戏,在这款游戏中,子弹像跳弹一样从墙上反弹。”

此外,如果你想要这是严格的2D,你可以通过使用各种Unity2D对象,函数和变量来极大地简化你的生活,比如Vector2而不是Vector3,在这一点上,像你试图使用的2D对撞机应该是可用的(而你切换到的3D盒子对撞机就不能)。

我对Unity不是很在行,也根本没有玩过Unity2D,但是从你正在尝试做的事情来看,Unity2D会让你的生活变得更容易。您可能希望在此处查看其文档和教程:

https://unity3d.com/learn/tutorials/topics/2d-game-creation

尝试使用全3D工具/变量/函数来做2D工作只会增加不必要的复杂性。这就像是试图乘坐喷气式飞机沿着一条穿过复杂而拥挤的城市的道路,在地面上勉强飞行,而不仅仅是开一辆车。如果你不去掉一个你不需要的维度,它只会让事情变得更加复杂。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28170685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档