亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從下一個實例化更改實例化游戲對象的移動

從下一個實例化更改實例化游戲對象的移動

C#
qq_遁去的一_1 2021-10-09 10:09:12
我正在使用 Unity 和 C#。在我的游戲中,敵人被反復實例化并以線性路徑向玩家移動。我想讓敵人在經過特定時間后以正弦波移動,以使游戲更加艱難。運動會立即發生變化,但我希望這種變化從新(下一個)敵人的實例化而不是當前存在的敵人的實例化生效。我能做什么?EnemySpawner 腳本 -private void Start(){    timeelapsed = 0f;    StartCoroutine(SpawnEnemies(delay));}private void Update(){    timeelapsed += Time.deltaTime;}private IEnumerator SpawnEnemies(float delay){    while (true)    {        SpawnNewEnemy();        yield return new WaitForSeconds(delay);    }}private void SpawnNewEnemy(){    if (!enemyclone)    {        enemyclone = Instantiate(enemy, enemySpawner.transform.position + offset, Quaternion.identity);    }}Enemy Movement 腳本:private void Update(){    t = Time.time;    if (EnemySpawner.timeelapsed > 0f && EnemySpawner.timeelapsed <= 20f)    {        enemy.transform.Translate(Vector3.forward * speed * Time.deltaTime);    }    if (EnemySpawner.timeelapsed > 20f && EnemySpawner.timeelapsed <= 40f)    {        enemy.GetComponent<Rigidbody>().velocity = Vector3.forward * 5 + Vector3.left * 3 * Mathf.Sin(10f * t);    }}
查看完整描述

2 回答

?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

有上千種方法可以實現這一點,但我認為可能易于實現和理解的一種方法是設置 Action,當您從 spawner 實例化一個新敵人時會觸發它。我很快就為您的 EnemySpawner 和 EnemyMovement 腳本編寫了一些我認為可能對您有所幫助的更改。


首先,EnemySpawner:


public static event Action EnemySpawning;

void SpawnNewEnemy ( )

{

    if ( !enemyclone )

    {

        EnemySpawning?.Invoke ( );

        enemyclone = Instantiate ( enemy, enemySpawner.transform.position + offset, Quaternion.identity );

    }

}

現在,敵人運動:


private bool travelInLinearPath = true;


private void OnEnable ( )

{

    EnemySpawner.EnemySpawning -= OnEnemySpawning;

    EnemySpawner.EnemySpawning += OnEnemySpawning;

    travelInLinearPath = true;

}


public void OnEnemySpawning( )

{

    EnemySpawner.EnemySpawning-= OnEnemySpawning;

    travelInLinearPath = false;

}


private void Update ( )

{

    if ( travelInLinearPath )

        enemy.transform.Translate ( Vector3.forward * speed * Time.deltaTime );

    else

        enemy.GetComponent<Rigidbody> ( ).velocity = Vector3.forward * 5 + Vector3.left * 3 * Mathf.Sin ( 10f * Time.time );

}

每次啟用敵人時,您都要求在下一個敵人即將產生時收到通知。發生這種情況時,您告訴這個敵人從線性運動變為正弦運動 ( travelInLinearPath)。您還要求在產生新敵人時不再通知該敵人(除非您重新啟用該敵人)。


我也沒有討論你是否應該從敵人對象池中抓取一個新的敵人。但希望你這樣做是我在OnEnable(). 您可能希望/需要將該代碼放入其中,Start()這取決于您在游戲后期的敵人實例化和創建。


查看完整回答
反對 回復 2021-10-09
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

現在知道請求是針對敵人的“波浪”,我們需要向每個敵人添加波浪定義項目。因此,首先修改EnemyMovement腳本:


public class EnemyMovement : MonoBehaviour

{

    public enum MovementType

    {

        None = 0,

        Linear = 1,

        Sinusoidal = 2

        // etc, etcc

    }


    /// <summary>

    /// Movement affects the movement type of the enemy.

    /// </summary>

    public MovementType Movement { get; set; }


    /// <summary>

    /// This affects the Speed of the Enemy. Used in conunction with Movement to

    /// produce the enenmy's wave movement type.

    /// </summary>

    public float Speed { get; set; }


    private Rigidbody rigidBody;



    private void Awake ( )

    {

        rigidBody = GetComponent<Rigidbody> ( );

    }



    private void Update ( )

    {

        switch ( Movement)

        {

            case MovementType.Linear:

                transform.Translate ( Vector3.forward * Speed * Time.deltaTime );

                break;

            case MovementType.Sinusoidal:

                // You probably want the Speed property to affect this as well...

                rigidBody.velocity = Vector3.forward * 5 + Vector3.left * 3 * Mathf.Sin ( 10f * Time.time );

                break;


           // Any extra movement types you want here...

        }


    }

}

然后是EnemySpawner驅動 Enemy 實例化的腳本:


public class EnemySpawner : MonoBehaviour

{

    public float Delay;

    public float StartSpeed;


    public GameObject enemy;

    public GameObject enemySpawner;

    public Vector3 offset;


    private float timeElapsed;

    private float currentSpeed;

    private EnemyMovement.MovementType currentMovement;



    void Start ( )

    {

        timeElapsed = 0f;

        currentSpeed = StartSpeed;

        StartCoroutine ( SpawnEnemies ( Delay ) );

        currentMovement = EnemyMovement.MovementType.Linear;

    }



    void Update ( )

    {

        timeElapsed += Time.deltaTime;


        // We can determine at what time the Wave parameters change here.

        if ( timeElapsed >= 40.0f )

        {

            currentSpeed += 10.0f; // Add speed, for example.

        }

        else if ( timeElapsed >= 20.0f )

        {

            currentMovement = EnemyMovement.MovementType.Sinusoidal;

        }

    }



    IEnumerator SpawnEnemies ( float delay )

    {

        while ( true )

        {

            var enemyClone = Instantiate ( enemy, enemySpawner.transform.position + offset, Quaternion.identity );

            var movement = enemyClone.GetComponent<EnemyMovement> ( );


            // We now set what the enemy uses as the Wave values.

            movement.Speed = currentSpeed;

            movement.Movement = currentMovement;


            yield return new WaitForSeconds ( delay );

        }

    }

}


查看完整回答
反對 回復 2021-10-09
  • 2 回答
  • 0 關注
  • 186 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號