【问题标题】:Shooting a projectile but goes in wrong direction - 2D game发射弹丸但方向错误 - 2D 游戏
【发布时间】:2017-09-05 07:45:03
【问题描述】:

我正在尝试制作一个简单的游戏,当用户触摸屏幕时我正在发射弹丸,我首先生成 8 个弹丸(精灵),当用户触摸屏幕时,我希望顶部的弹丸在触摸时飞行方向。我能够做到这一点;但是,每次我射击时,弹丸都会朝错误的方向飞去,这里有一张图片可以说明这个问题。

显然图像还在这里,但物体会继续飞行,直到它飞出屏幕然后被摧毁。

这是处理这个问题的代码sn-p

GameplayController.cs

if (Input.GetMouseButtonDown(0))
    {
        Vector3 position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
        position = Camera.main.ScreenToWorldPoint(position);

        GameObject target;
        target = new GameObject();
        target.transform.position = position;


        Arrow comp = currentArrows[0].GetComponent<Arrow>();
        comp.setTarget(target.transform);
        comp.GetComponent<Arrow>().arrowSpeed = 12;
        comp.GetComponent<Arrow>().shoot = true;
        currentArrows.RemoveAt(0);
        Destroy(target);
    }

我知道我在这里得到的是鼠标输入而不是手机触摸,这对我来说很好,稍后我会将其转换为触摸输入。

Arrow.cs

public bool shoot = false;
public float arrowSpeed = 0.0f;
public Vector3 myDir;
public float speed = 30.0f;
private Transform target;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
    if(shoot)
    {
        transform.position += transform.right * arrowSpeed * Time.deltaTime;
    }

}


public void setTarget(Transform targetTransform)
{
    this.target = targetTransform;
    Vector3 vectorToTarget = target.position - transform.position;
    float angle = Mathf.Atan2(vectorToTarget.y, vectorToTarget.x) * Mathf.Rad2Deg;
    Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
    transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * speed);
}

private void OnBecameInvisible()
{
    print("Disappeared");
    Destroy(gameObject);
    Gameplay.instance.isShooting = false;
}

【问题讨论】:

  • 你为什么用这个? ` transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * speed);`
  • @HieuNguyenTrung 已经摆脱了它,现在我正在使用 Lerp。

标签: c# unity3d game-physics unity2d


【解决方案1】:

Vector3 位置 = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);

我认为您的问题是您通过点击获取 屏幕 坐标,而不是世界坐标,这实际上是两个不同的东西。为了正确引导你的射弹,你需要将你的屏幕坐标转换为世界,就像它所做的那样here

接下来是如何移动弹丸:

transform.position += transform.right * arrowSpeed * Time.deltaTime;

您将弹丸向右移动,然后以某种方式旋转它。也许您应该尝试使用Vector3.Lerp 移动它,这样会更容易并使用Transform.LookAt 旋转它。

【讨论】:

  • 完成了,同样的问题...我更新了代码,并包含了那行代码。
  • @MuhandJumah,编辑了答案。我再次查看了弹丸运动代码。尝试改变将弹丸移动到 Vector3.Lerp 的方式,这样会更简单
  • @这可行,但它会将对象转换为鼠标坐标,如果我希望对象在没有碰撞的情况下继续飞行怎么办?当物体移出相机时,我正在处理物体的破坏。我希望它继续朝着鼠标点击的方向飞行。
  • @MuhandJumah - 旋转对象,使其在发射开始时朝方向 (Transform.LookAt) 看一次,然后尝试在 Transform.Forward 方向使用 Transform.Translate(当然是相乘它由速度和所有需要的增量)
  • 再次感谢,我能够使用 Update var forward = Vector3.forward; 中的这行代码让它飞向那个方向。 //transform.position += transform.right * arrowSpeed * Time.deltaTime; transform.Translate(forward * 30 * Time.deltaTime);和 transform.LookAt(target, Vector3.forward);在我的发射中。尽管 Z 不断变化并且子弹到达鼠标坐标时从视图中消失,但存在 1 个问题。我尝试将 forward.z 设置为 0 但这根本没有帮助。有任何想法吗?非常感谢您,非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多