【问题标题】:Split a bullet in 3 different directions将子弹分成 3 个不同的方向
【发布时间】:2020-11-21 21:29:39
【问题描述】:

我正在尝试为弹丸分配一项技能,该技能在使用时会将项目分成 3 个(原始弹丸和另外 2 个新弹丸)。

但是,当我实例化这两个克隆时,我无法将任何动作归因于它们。他们的想法是让他们接受this route:

绿色虚线表示原始子弹的运动,蓝色矢量表示原始子弹在特殊激活时的瞬时速度,红色矢量表示属于每个新生成的子弹的两个速度矢量,以及绿色角度表示新子弹相对于原始速度方向的方向

但此刻,它们只是站在抛物线的点上,它们被实例化了。无论我做什么,我似乎都无法为他们的rigidbody2D 赋予任何价值。有谁知道如何解决这个问题?

这是我目前的代码

能力脚本:

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);

            //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.velocity = new Vector2(original_velocity.x, original_velocity.y) * Time.deltaTime;
            rb_bird_up.AddForce(new Vector2(3, 5) * 500);
        }
    }
}

主鸟:

public class Birb : MonoBehaviour
{
    #region Provided Code, Do Not Edit
    private Rigidbody2D m_rigidbody;

    private bool m_canExecuteAirSpecial = true;

    public bool CanExecuteAirSpecial
    {
        get
        {
            return m_rigidbody.simulated && m_canExecuteAirSpecial;
        }
    }

    private void Awake()
    {
        m_rigidbody = GetComponent<Rigidbody2D>();
        StopBirbSimulation();
    }

    public void StopBirbSimulation()
    {
        m_rigidbody.simulated = false;
    }

    public void StartBirbSimulation()
    {
        m_rigidbody.simulated = true;
    }

    public void SetPosition( Vector3 position )
    {
        if ( m_rigidbody.simulated )
        {
            m_rigidbody.MovePosition( position );
        }
        else
        {
            transform.position = position;
        }
    }

    public void ExecuteAirSpecial()
    {
        GetComponent<IAirSpecial>().ExecuteAirSpecial();
        m_canExecuteAirSpecial = false;
    }

    private void OnCollisionEnter2D( Collision2D collision )
    {
        m_canExecuteAirSpecial = false;
    }

    public static GameObject MakeBirbCopy( GameObject original )
    {
        Birb newBirb = Instantiate(original).GetComponent<Birb>();
        newBirb.m_canExecuteAirSpecial = false;
        return newBirb.gameObject;
    }
    #endregion

    [Range( 0, 25 )]
    public float LaunchForce = 12;

    public void Launch(Vector3 offset, float maximumStretch, Rigidbody2D rigidbody)
    {
        rigidbody.velocity = new Vector2(offset.x * -LaunchForce, offset.y * -LaunchForce) * (maximumStretch/2);
    }

}

【问题讨论】:

    标签: c# unity3d game-physics instantiation rigid-bodies


    【解决方案1】:

    好的,显然,我只需要在实例化后将“模拟”设置为真。

        rb_bird_down.simulated = true;
        rb_bird_up.simulated = true;
    

    文档可能会更清楚地说明这一点,因为他们说所有属性都被复制,但事实并非如此......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-04
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2019-07-05
      相关资源
      最近更新 更多