C# 使用Quaternion.AngleAxis在3个不同方向上拆分子弹
我试图为一个投射物分配一项技能,当使用该技能时,该技能将项目分为3个(原始投射物和2个新投射物) 然而,当我实例化这两个克隆时,它们始终遵循相同的轨迹。他们的想法是: 绿色虚线表示原始子弹的运动,蓝色矢量表示特殊激活时原始子弹的瞬时速度,红色矢量表示属于每个新生成子弹的两个速度矢量,绿色角指示新子弹相对于原始速度方向的方向 但目前,它们产卵并继续沿着与最初相同的轨迹前进。精灵甚至会旋转到正确的角度,但这似乎对物理的应用没有多大影响 有人知道我怎么解决这个问题吗 这是到目前为止我的代码 能力脚本:C# 使用Quaternion.AngleAxis在3个不同方向上拆分子弹,c#,unity3d,rotation,quaternions,rigid-bodies,C#,Unity3d,Rotation,Quaternions,Rigid Bodies,我试图为一个投射物分配一项技能,当使用该技能时,该技能将项目分为3个(原始投射物和2个新投射物) 然而,当我实例化这两个克隆时,它们始终遵循相同的轨迹。他们的想法是: 绿色虚线表示原始子弹的运动,蓝色矢量表示特殊激活时原始子弹的瞬时速度,红色矢量表示属于每个新生成子弹的两个速度矢量,绿色角指示新子弹相对于原始速度方向的方向 但目前,它们产卵并继续沿着与最初相同的轨迹前进。精灵甚至会旋转到正确的角度,但这似乎对物理的应用没有多大影响 有人知道我怎么解决这个问题吗 这是到目前为止我的代码 能力脚本:
public class AirSpecialSplit : MonoBehaviour, IAirSpecial
{
public float SplitAngleInDegrees = 10;
GameObject bird_down;
GameObject bird_up;
public void ExecuteAirSpecial()
{
{
//hold the velocity of the original bird
Vector2 original_velocity = this.gameObject.GetComponent<Rigidbody2D>().velocity;
//clone two new birds
bird_down = Birb.MakeBirbCopy(this.gameObject);
bird_up = Birb.MakeBirbCopy(this.gameObject);
//apply the angle to the clones
bird_down.transform.rotation = Quaternion.AngleAxis(-SplitAngleInDegrees, Vector2.up);
bird_up.transform.rotation = Quaternion.AngleAxis(SplitAngleInDegrees, Vector2.up);
//get the rigidboy from the clones
Rigidbody2D rb_bird_down = bird_down.GetComponent<Rigidbody2D>();
Rigidbody2D rb_bird_up = bird_up.GetComponent<Rigidbody2D>();
rb_bird_down.simulated = true;
rb_bird_up.simulated = true;
rb_bird_down.velocity = new Vector2(original_velocity.x, original_velocity.y);
rb_bird_up.velocity = new Vector2(original_velocity.x, original_velocity.y);
}
}
}
public class airsspecialsplit:monobhavior,IAirSpecial
{
公共浮点数SplitAngleInDegrees=10;
游戏物体鸟_下来;
游戏物体鸟_up;
public void ExecuteAirSpecial()
{
{
//保持原始鸟的速度
Vector2原始速度=this.gameObject.GetComponent().velocity;
//克隆两只新鸟
bird_down=Birb.MakeBirbCopy(this.gameObject);
bird\u up=Birb.MakeBirbCopy(this.gameObject);
//将角度应用于克隆
bird_down.transform.rotation=四元数.AngleAxis(-SplitAngleInDegrees,Vector2.up);
bird_up.transform.rotation=Quaternion.AngleAxis(SplitAngleInDegrees,Vector2.up);
//从克隆人那里得到那个硬汉
Rigidbody2D rb_bird_down=bird_down.GetComponent();
Rigidbody2D rb_bird_up=bird_up.GetComponent();
rb_bird_down.simulated=true;
rb_bird_up.simulated=true;
rb_bird_down.velocity=新矢量2(原始速度.x,原始速度.y);
rb_bird_up.velocity=新矢量2(原始速度.x,原始速度.y);
}
}
}
你对两者都应用相同的速度
,因此它们当然会朝着相同的方向移动。速度
在世界空间中
您可能希望添加旋转,例如
rb_bird_down.velocity = bird_down.transform.forward * original_velocity.magnitude;
在此之前,您可能应该考虑当前的项目符号旋转,如
bird_down.tranform.rotation = transform.rotstion * Quaternion.Euler(0,0, -SplitAngleInDegrees);
看起来你只是将原始速度指定为新对象的速度,但也许你已经意识到了这一点,并且在问该怎么做。此外,新对象是否是场景层次中原始对象的子对象?或者它们是独立的物体?是的,我想这可能是他们“只需遵循原始”问题的原因,但我尝试的任何其他解决方案都会导致子弹直接落在地上。是的,他们是独立的。不幸的是,这不起作用。经过这些修改,这些鸟甚至没有沿着抛物线的轨迹飞行。它们只有在实例化后才会直线下降。@Zimzom:你能发布Birb.MakeBirbCopy()的代码吗?@scg sure
public static GameObject MakeBirbCopy(GameObject original){Birb newBirb=Instantiate(original.GetComponent();newBirb.m_canexecuteairsecial=false;返回newBirb.GameObject;}
刚体是运动的吗?(我猜不是,因为你在操纵速度。)有没有其他力被施加,比如重力?不,它们不是运动学的。我用重力来计算子弹轨迹的抛物线