【问题标题】:Unity C#: Projectile speed relative to distance between mouseUnity C#:弹丸速度相对于鼠标之间的距离
【发布时间】:2018-03-17 13:36:56
【问题描述】:

我在 Unity 中遇到了一个问题,我试图用一个方向和一个速度实例化一个射弹。方向取决于 RotateMouse() 函数,该函数计算相对于鼠标的方向(对于射弹)。标准化后,我将其发送到另一个“弹丸运动”脚本,该脚本只是将其与速度相乘。

由于某种原因,当我将鼠标沿某个方向靠近角色时,它会变得非常慢,而距离很远则相反...我还调试了所有值,并且每个“方向”变量都是 sub 1 在 x,y 和 z...

你能发现问题吗?行为是尽管被标准化,但它的速度会有所不同,我不明白。

方向计算发生的脚本:

    public void RotateMouse()
{
    if (Input.GetButton(FindCharacter.FindPlayer(gameObject) + "AimPC"))
    {
        aimingMouse = true;
        sRenderer.enabled = true;
        canShoot = true;

        var mousePos = Input.mousePosition;
        var magePos = Camera.main.WorldToScreenPoint(transform.position);
        difference = mousePos - magePos;

        difference.Normalize(); // after normalize == direction

        rotation_z = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(new Vector3(transform.rotation.x, transform.rotation.y, rotation_z + spriteRotationOffset));

    }
    else
    {
        aimingMouse = false;
        sRenderer.enabled = false;
        canShoot = false;
    }

}

我实例化弹丸并立即设置方向的另一个脚本:

projectileDir = new Vector3(controller.difference.x, 控制器.difference.y、控制器.difference.z);

    public IEnumerator ShootProjectile(int elementNr)
{
    shooting = true;

    GameObject projectile = Instantiate(projectilePrefabs[elementNr], instantiatePosition, Quaternion.Euler(0, 0, controller.rotation_z + rotationOffsetZ));
    projectile.GetComponent<ProjectileMovement>().Direction(projectileDir);
    yield return new WaitForSeconds(shootDuration);

    shooting = false;

}

最后是使用方向变量和计算速度的地方:

public class ProjectileMovement : MonoBehaviour {

public float speed;

private Rigidbody2D rb;
private Vector3 direction;
private Collider2D projectileCollider;
private Animator animator;

void Start()
{
    rb = GetComponent<Rigidbody2D>();
    projectileCollider = GetComponent<Collider2D>();
    animator = GetComponent<Animator>();
    rb.velocity = speed * direction;
}

public void Direction(Vector3 startingDirection)
{
    this.direction = startingDirection;
}

void FixedUpdate()
{
    rb.velocity = direction * speed;

}
}

而且,如果您想了解有关脚本的更多信息,我可以提供,但我想我正在展示与此问题相关的所有内容。如果有不清楚的地方,可以评论。

如果问题难以想象,请查看此 GIF 并观察相对于鼠标指针的火球速度:
Gyazo gif link

【问题讨论】:

  • 它看起来不像 projectileDir 被规范化。这是与速度一起使用的值。你能贴出如何分配的代码吗
  • 您好,projectileDir 的值在“ShootProjectile”协程代码的上方。
  • 尽管如此,我还是改变了它,所以我直接在 RotateMouse 函数的 Shoot 脚本中使用了 controller.difference。它的行为相同。所以我写了这个: projectile.GetComponent().Direction(controller.difference);但结果相同。并且差异被归一化。
  • 可能它也在z轴上进行归一化。确保您正在规范化的值是 Vector2。
  • 哇!就是这样..我将差异重命名为差异V2(矢量2)作为占位符并将其值放入差异V3(因为我想操纵z值)并在方向函数中使用V3,这一切都像一个魅力!谢谢:)

标签: c# unity3d 2d projectile


【解决方案1】:

问题是我对 Vector3 进行了归一化,通过首先对 Vector2 进行归一化(这给了我不同/正确的结果)然后将 x 和 y 值放入 Vector3 以也利用 z 维度来解决它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多