前言:
我们前面忘记设置的当敌机和子弹碰到特定的位置(指屏幕外的)就会自动销毁
挂载的脚本Sherred如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shredder : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D collision)
{
Destroy(collision.gameObject);
}
}
正题:
ok我们现在开始制作敌人按指定路径以及敌人生成点脚本
首先你先创建一个空对象Path再给它几个子空对象,这是敌机需要移动的方向,然后用空物体的不同位置比如斜角的移动,只需要设置几个点就行,然后再把Path拖到我们创建的Paths的文上
然后我们需要创建数据文件来保存有关敌机的各种数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName ="Enemy Wave Config")]
public class Wayconfig : ScriptableObject
{
[SerializeField] GameObject enemyPrefab; //敌机预设体
[SerializeField] GameObject pathPrefab; //路径Path
[SerializeField] float timeBetweenSpawns = 0.5f; //敌机生成的间隔时间
[SerializeField] float spawnRandomFactor = 0.3f; //
[SerializeField] int numberOfEnemies = 5; //生成多少个敌机
[SerializeField] float moveSpeed = 2f; //敌机的移动速度
public GameObject GetEnemyPrefab()
{
return enemyPrefab;
}
public List<Transform> GetWayPoints() //返回一个为Transform类型的链表即路径Path的子对象我们设置的那些路径点
{
var waveWayPoints = new List<Transform>();
foreach (Transform child in pathPrefab.transform)
{
waveWayPoints.Add(child);
}
return waveWayPoints;
}
public float GetTimeBetweenSpawns()
{
return timeBetweenSpawns;
}
public float GetSpawnRandomFactor()
{
return spawnRandomFactor;
}
public int GetNumberOfEnemies()
{
return numberOfEnemies;
}
public float GetMoveSpeed()
{
return moveSpeed;
}
}
当我们点击Create的时候就可以看到最顶端我们可以创建记录敌机数据的表,我们创建多几个并统一叫Wave统一放在名字叫Waves的文件夹
我们把我们创建的Enemy和Path的Prefab都设置后下面那四个数字也都可以动
保存好数据后我们还需要一个敌人生成器EnemySpawner,先创建一个同名的空对象
代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemySpawner : MonoBehaviour
{
[SerializeField] bool looping = false; //控制是否循环执行生成wave
public List<Wayconfig> waveConfigs; //创建waveconfig类型的链表
int startingWave = 0;
IEnumerator Start()
{
do
{
yield return StartCoroutine(SpawnAllWaves());
} while (looping);
}
IEnumerator SpawnAllWaves()
{
for (int waveIndex = 0; waveIndex < waveConfigs.Count; waveIndex++)
{
var currentWave = waveConfigs[waveIndex]; //决定生成的是第index波
yield return StartCoroutine(SpawnAllEnemiesInWave(currentWave));
}
}
IEnumerator SpawnAllEnemiesInWave(Wayconfig waveConfig)
{
for (int enemyCounts = 0; enemyCounts < waveConfig.GetNumberOfEnemies(); enemyCounts++) //当小于最大敌人生成数量的时候就循环生成
{
var newEnemy = Instantiate(waveConfig.GetEnemyPrefab(), waveConfig.GetWayPoints()[0].transform.position, Quaternion.identity); //GetWayPoints()[0]即第一个标记点
newEnemy.GetComponent<EnemyPathing>().SetWaveConfig(waveConfig);
yield return new WaitForSeconds(waveConfig.GetTimeBetweenSpawns());
}
}
}
写完后我们发现怎么没有给敌机移动的脚本呢,于是我们要创建一个EnemyPathing供Enemy移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyPathing : MonoBehaviour
{
Wayconfig waveConfig;
List<Transform> waypoints;
int wayPointIndex = 0;
void Start()
{
waypoints = waveConfig.GetWayPoints();
transform.position = waypoints[wayPointIndex].transform.position;
}
// Update is called once per frame
void Update()
{
Move();
}
public void SetWaveConfig(Wayconfig waveConfig)
{
this.waveConfig = waveConfig;
}
private void Move() //控制敌机的移动
{
if (wayPointIndex <= waypoints.Count - 1)
{
var targetPosition = waypoints[wayPointIndex].transform.position;
var movementThisFrame = waveConfig.GetMoveSpeed() * Time.deltaTime;
transform.position = Vector2.MoveTowards(transform.position, targetPosition, movementThisFrame);
if (transform.position == targetPosition)
{
wayPointIndex++;
}
}
else
{
Destroy(gameObject);
}
}
}
然后绑到Enemy的Prefab上
学习产出:
可见敌人已经按照我们制定的顺序出场了