Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个人如何去做一个三连击的效果,根据玩家的目标旋转?_C#_Unity3d_Math - Fatal编程技术网

C# 一个人如何去做一个三连击的效果,根据玩家的目标旋转?

C# 一个人如何去做一个三连击的效果,根据玩家的目标旋转?,c#,unity3d,math,C#,Unity3d,Math,我正在做一个自上而下的射击游戏项目。我一直有问题,创造一个三杆的效果,玩家将开枪3发。这些子弹彼此平行,角度与玩家瞄准的角度相同 上面的例子显示了玩家的两个射击角度,一个向左,一个向上 目前的问题是,我几乎不知道我将如何尝试这样做,因为我的数学相当差。我的第一次尝试非常失败,如下所示 我在以前的数学书中对此进行了研究,我得出的结论是,我需要专注于三角学(特别是正弦和余弦)。我只是不知道我到底要如何实现三重射击效应的逻辑 以下是第一次尝试的代码: public class TripleShot

我正在做一个自上而下的射击游戏项目。我一直有问题,创造一个三杆的效果,玩家将开枪3发。这些子弹彼此平行,角度与玩家瞄准的角度相同

上面的例子显示了玩家的两个射击角度,一个向左,一个向上

目前的问题是,我几乎不知道我将如何尝试这样做,因为我的数学相当差。我的第一次尝试非常失败,如下所示

我在以前的数学书中对此进行了研究,我得出的结论是,我需要专注于三角学(特别是正弦和余弦)。我只是不知道我到底要如何实现三重射击效应的逻辑

以下是第一次尝试的代码:

public class TripleShot : CoreWeaponPart
    {
        public enum FireType { Spread, Row }
        public FireType fireType;
        public override Bullet[] FirePattern(PlayerController owner, Weapon mainWeapon)
        {
            Bullet[] bullets = new Bullet[3 + mainWeapon.fireAmount];
            for (int i = 0; i < bullets.Length; i++)
            {
                Bullet bullet = ObjectPooler.GetPooledObject<Bullet>(true); //Get an available bullet from the pool of bullets.
                bullet.Damage = mainWeapon.damage;
                bullet.Lifespan = mainWeapon.bulletLifespan;
                bullet.Owner = owner;

                switch (fireType)
                {
                    case FireType.Spread: //Create a spread effect for the tripleshot.
                        bullet.transform.position = owner.barrelPos.position;
                        bullet.transform.rotation = (owner.barrelPos.rotation * Quaternion.Euler(0, -29.5f, 0)) * Quaternion.Euler(0, 15f * (i + 1f + mainWeapon.fireSpread), 0);
                        break;

                    case FireType.Row: //Create a parallel effect for the tripleshot (current problem).

                        bullet.transform.position = owner.barrelPos.position - (transform.forward + new Vector3(5 + mainWeapon.fireSpread, 0, 0)) + (new Vector3(5 * (i + 1f + mainWeapon.fireSpread), 0, 0));
                        bullet.transform.rotation = owner.barrelPos.rotation;
                        break;

                }


                bullet.Direction = bullet.transform.forward.normalized * mainWeapon.bulletVelocity;

                bullet.SetActive(true);

                bullets[i] = bullet;
            }

            return bullets;
        }
    }
    

公共类TripleShot:CoreWeaponPart
{
公共枚举火种{排列,行}
公共火种火种;
公共覆盖子弹[]火力模式(玩家控制器所有者,武器主武器)
{
子弹[]子弹=新子弹[3+主武器.火力];
对于(int i=0;i
这不需要使用三角函数。相反,使用转换为您完成工作

首先,添加一个
maxParallelSpread
术语,这样可以防止在发射大量子弹时,从一个荒谬的距离发射子弹

然后,您可以定义
parallelSpread
,子弹到枪管左侧或右侧的距离为
Mathf.Min(maxParallelSpread,(子弹长度-1)*mainArmour.fireSpread)
。然后每个项目符号沿着该距离定位在该部分:
(float)i/(bullets.Length-1)

您可以使用
Mathf.Lerp(-parallelSpread,parallelSpread,(float)i/(bullets.Length-1))
计算子弹沿
transform.right
从枪管位置移动的距离

总共:

public class TripleShot : CoreWeaponPart
{
    public enum FireType { Spread, Row }
    public FireType fireType;
    public maxParallelSpread = 5f;

    public override Bullet[] FirePattern(PlayerController owner, Weapon mainWeapon)
    {
        Bullet[] bullets = new Bullet[3 + mainWeapon.fireAmount];
        float parallelSpread = Mathf.Min(maxParallelWidth, (bullets.Length-1) 
                * mainWeapon.fireSpread);
        for (int i = 0; i < bullets.Length; i++)
        {
            //Get an available bullet from the pool of bullets.
            Bullet bullet = ObjectPooler.GetPooledObject<Bullet>(true); 

            bullet.Damage = mainWeapon.damage;
            bullet.Lifespan = mainWeapon.bulletLifespan;
            bullet.Owner = owner;

            switch (fireType)
            {
                case FireType.Spread: //Create a spread effect for the tripleshot.
                    bullet.transform.position = owner.barrelPos.position;
                    bullet.transform.rotation = ( owner.barrelPos.rotation 
                            * Quaternion.Euler(0, -29.5f, 0)) 
                            * Quaternion.Euler(0, 15f * (i + 1f 
                            + mainWeapon.fireSpread), 0);
                    break;

                case FireType.Row: //Create a parallel effect for the tripleshot
                    float bulletRightness = Mathf.Lerp(-parallelSpread, 
                            parallelSpread, (float)i/(bullets.Length-1));
                    bullet.transform.position = owner.barrelPos.position 
                            + transform.right * bulletRightness;
                    bullet.transform.rotation = owner.barrelPos.rotation;
                    break;

            }


            bullet.Direction = bullet.transform.forward.normalized 
                    * mainWeapon.bulletVelocity;

            bullet.SetActive(true);

            bullets[i] = bullet;
        }

        return bullets;
    }
}

你需要画一个直角三角形,其中三条边是1)墙2)一条从射手到墙的线3)子弹的行进线。你可以得到子弹击中墙壁的角度,也就是90度的子弹发射的角度。当子弹击中墙壁时,它将以与击中墙壁相同的角度从墙壁反弹。所以,若子弹以30度的角度击中墙壁,它将以30度的角度以相反的方向(180-30=150)从墙壁上弹回。这个主意很酷,但这并不是我想要的。我正在试图找出如何根据玩家的目标,以正确的旋转方式平行射击3颗子弹。
        float parallelSpread = Mathf.Min(maxParallelWidth, (bullets.Length-1) 
                * 2f * mainWeapon.fireSpread);