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()這取決于您在游戲后期的敵人實例化和創建。

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 );
}
}
}
- 2 回答
- 0 關注
- 186 瀏覽
添加回答
舉報