旋转一个射弹精灵以面对一个倾斜的相机和它飞向的目标。二维自上而下

Rotating a projectile sprite to face an angled camera and the target it is flying at. 2D top down

Results that im getting, and result that I want. Descriptive image.

我知道以前有人问过这个问题,但不是这样,相信我,我一直在这个论坛上寻找解决方案并统一回答。

我正在制作一个 2d top down 游戏,怪物可以向我的角色发射弹丸。我已经解决了这个问题,方法是让他们从动画中一个特定点在一个空游戏对象的位置实例化一个射弹预制件,它看起来很好。我已经让射弹找到了玩家,并通过瞄准他最初所在的位置而不是他经常所在的位置来使其可以躲避。所以此刻射弹的运动是完美的,我为自己感到骄傲!,是的,半新的。这是我使用的代码:

    public void OnCastComplete()
{
    var projectile = Instantiate(fireball, projectileInitialLocation.transform.position, transform.rotation);

    projectile.transform.LookAt(currentTarget.transform.position);

    projectile.velocity = projectile.transform.forward * projectileSpeed;

    Vector2 dir = currentTarget.transform.position - projectile.transform.position;
    float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;

    projectile.transform.rotation = Quaternion.AngleAxis(angle, Vector2.up);
}

如果我的主摄像头没有倾斜,这也能很好地工作。我需要的外观和感觉是相机处于一定角度,使我游戏中的 3D 元素栩栩如生,同时周围仍然有 2d 精灵 运行。这意味着所有的精灵,包括射弹都需要有一个脚本才能面对相机。

这是脚本:

    public Transform target;

void Start () {
    target = GameObject.Find("MainCamera").GetComponent<Transform>();
}

void Update () {

    if (target != null)

        this.transform.rotation = Camera.main.transform.rotation;
}

现在我确信这两个脚本是这里的罪魁祸首,因为我可以看到一个在确保物体面向相机方面做得很好,另一个确保正确旋转 sprite。但他们不能一起工作。从射弹中移除后一个脚本意味着它有时不可见或旋转到一个角度,观众几乎不会注意到它。附加它意味着它面向相机,但在我上面 posted 的图片中给出了结果。

我无法让他们相处融洽而且问题非常具体恐怕我需要 post 在这里提问 =(

希望有人能帮忙!

谢谢!

当然,我在发布问题 10 分钟后设法解决了这个问题。

我修复它的方法是更改​​删除脚本以面对射弹上的相机。像这样实例化射弹时对其进行补偿:

    public void OnCastComplete()
{
    var projectile = Instantiate(fireball, projectileInitialLocation.transform.position, transform.rotation);

    projectile.transform.LookAt(currentTarget.transform.position);

    projectile.velocity = projectile.transform.forward * projectileSpeed;

    Vector2 dir = currentTarget.transform.position - projectile.transform.position;
    float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;

    //projectile.transform.rotation = Quaternion.AngleAxis(angle, Vector2.up);
    projectile.transform.rotation = Quaternion.Euler(-25, 0, angle);
}

我注释掉的那行是上一行,它下面的那一行解决了这个问题。通过在 x 上添加 -25 来补偿相机,并通过将 "angle" 添加到 z 欧拉角来补偿精灵的旋转。

希望这对某人有所帮助。