在两个角度之间实例化的多个GameObject

时间:2019-08-09 19:40:22

标签: c# unity3d

我试图在等距间隔的角度之间生成 n 游戏对象。

理想情况下,我希望能够将“圆锥”调整为使敌人能够以任何方向,任何密度射击。

有人可以看到我做错了吗?

enter image description here

这些是敌人的投射物。我正在尝试“散布射击”。想想NES塞尔达传说中1级的巨龙:

enter image description here

不过,我不确定我的实现会发生什么情况。

enter image description here

Projectile.cs

    public Vector2 moveDirection = Vector2.zero;
    public float moveSpeed = 4.0f;

    private void FixedUpdate()
    {
        _body.MovePosition(transform.position + (new Vector3(moveDirection.x, moveDirection.y, 0).normalized) * (moveSpeed * Time.deltaTime));
    }

MultiShooter.cs

public GameObject projectileObject;
public Transform projectileEmitter;
[Range(2, 10)] public int numToShoot = 3;
[Space]
[Range(0, 360)] public int angle = 30;
[Range(1, 50)]  public float rayRange = 10.0f;
[Range(0, 360)] public float coneDirection = 180;
public void OnStartShooting()
{
    for (int i = 1; i <= numToShoot; i++)
    {
        var projectile = Instantiate(projectileObject);
        projectile.transform.position = projectileEmitter.position;
        var projectileScript = projectile.GetComponent<Projectile>();
        projectileScript.moveDirection = DirFromAngle(((angle / i) + coneDirection)* pointDistance, rayRange);
        projectile.SetActive(true);
    }
}
public Vector3 DirFromAngle(float angleInDegrees, float range)
{
   return Quaternion.AngleAxis(angleInDegrees, Vector3.forward) * transform.up * range;
}

编辑器脚本以显示行。

private void OnSceneGUI()
    {
        MultiShooter fow = (MultiShooter)target;
        Handles.color = Color.magenta;

        Vector3 upDirection = fow.DirFromAngle((-fow.angle / 2.0f) + fow.coneDirection, fow.rayRange);
        Vector3 dwDirection = fow.DirFromAngle((fow.angle / 2.0f) + fow.coneDirection, fow.rayRange);

        Handles.DrawLine(fow.projectileEmitter.position, upDirection);
        Handles.DrawLine(fow.projectileEmitter.position, dwDirection);

    }

1 个答案:

答案 0 :(得分:1)

对于第i个对象,对于范围numToShoot> 1,可以使用公式i /(numToShoot-1)来表示从范围的一侧到另一侧的角距离的分数。如果numToShoot == 1,您只需将百分比设为50%就可以在范围的中间进行拍摄。

您的绘图方法似乎可以使用锥方向±角度/ 2,因此我们可以从该角度百分比中减去.5,以距范围中心的角度距离来表示它。

然后,我们可以使用与锥体方向+角度百分比*角度范围相同的绘制方法来计算数学:

public void OnStartShooting()
{
    for (int i = 0; i < numToShoot; i++)
    {
        var projectile = Instantiate(projectileObject);
        projectile.transform.position = projectileEmitter.position;
        var projectileScript = projectile.GetComponent<Projectile>();
        float anglePercentage;
        if (numToShoot == 1)
            anglePercentage = 0f;
        else
            anglePercentage = (float)i/(numToShoot-1f) - .5f;

        projectileScript.moveDirection = DirFromAngle(
                  coneDirection 
                + anglePercentage * angle, rayRange);
        projectile.SetActive(true);
    }
}