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