前言:
我们前面忘记设置的当敌机和子弹碰到特定的位置(指屏幕外的)就会自动销毁
挂载的脚本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 GetWayPoints() //返回一个为Transform类型的链表即路径Path的子对象我们设置的那些路径点
{
var waveWayPoints = new List();
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 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().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 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
关注
打赏
热门博文
- 【Untiy2D独立/合作开发】特别篇:如何实现快速丢掉物品
- [Unity2D独立/合作开发]实现记录物品在不同场景的存在状态,附:场景的淡入淡出功能和预加载
- 【Unity好插件之PlayMaker系列一上半部分】如何只用一个插件和一个脚本完成制作一个简易的游戏
- [Unity存档系统]简单介绍Unity常见存档系统二JSON以及使用方法
- [Unity存档系统]简单介绍Unity常见存档系统之一PlayerPrefs以及使用方法
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏⑤制作得分系统以及能量的使用。
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏④制作敌人管理器以及播数显示和音效以及场景加载器
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏③制作血条和能量条UI以及生命值系统和能量值系统
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏②游戏画面后处理以及制作玩家子弹
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏①简单制作滚动卷轴以及玩家移动