【Unity2D入门教程】简单制作战机弹幕射击游戏④C#编写 敌人按指定路径以及敌人生成点脚本

article/2025/7/15 20:35:29

前言:

我们前面忘记设置的当敌机和子弹碰到特定的位置(指屏幕外的)就会自动销毁

挂载的脚本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; //控制是否循环执行生成wavepublic 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 framevoid 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上 


学习产出:

可见敌人已经按照我们制定的顺序出场了


http://chatgpt.dhexx.cn/article/NAj89joG.shtml

相关文章

【Unity2D入门教程】简单制作战机弹幕射击游戏⑤C#编写 背景滚动移动以及增加粒子特效

学习目标&#xff1a; 上期结束后我们游戏的主体就已经差不多了&#xff0c;剩下的就要给游戏的真实质感以及可玩性上下大点功夫了&#xff0c;今天我们就从背景滚动移动以及增加粒子特效上出发。 背景滚动制作&#xff1a; 为了让游戏更具真实性的就是让玩家从视觉上感受飞机…

【Unity2D入门教程】简单制作战机弹幕射击游戏② C#编写 Player和Enemy脚本

学习目标&#xff1a; 上期的水平大伙看到我已经写好了Enemy和Player的脚本了&#xff0c;现在就把脚本教给大伙&#xff0c;话不多说搞的不丑 学习内容&#xff1a; 首先是Player的脚本&#xff08;之前没发现CSDN有这个代码段的&#xff0c;我的我的&#xff09; using Sy…

【Unity2D入门教程】简单制作战机弹幕射击游戏① 导入素材

学习目标&#xff1a; 今天我们制作一款类似银河战机的游戏导入素材并给它设置一下背景&#xff0c;把素材做成预设体等等 首先先上网找到我们需要的素材 Unity Asset Store - The Best Assets for Game MakingDiscover the best assets for game making. Choose from our mas…

弹幕射击游戏中旋转矩形碰撞检测的算法描述

分离轴法是根据两个多边形的几何中心在任意矢量方向的法线上的投影存在交叉的条件来做出的方法[32]。换而言之&#xff0c;如果可以找出这样一个方向&#xff0c;将两个多边形投影在此方向的法线上的投影不交叉&#xff0c;则说明碰撞未发生&#xff0c;如图5-3所示。 图中A、B…

Cocos2d-x 简单弹幕射击游戏

开发环境 Win10, Cocos2d-x v3.16, Visual Studio 2017, Visual Studio Code 项目阐述 这个游戏是一个小型的弹幕游戏。玩家将控制pipi美&#xff0c;在躲避pop子的子弹之余&#xff0c;射杀pop子。名字打算叫“pop子的深邃黑暗幻想”。 游戏的设计主要借鉴了东方系列的弹幕游…

程序员职业规划和学习规划

程序员职业规划路线 技术体系 阿里程序员等级 学习规划

程序员职业发展规划

程序员职业生涯发展到一定的程度都会面临着职业发展方向选择的问题&#xff0c;随着年龄的增长&#xff0c;面对日新月异的代码&#xff0c;感到力不从心&#xff0c;更年轻的程序员层出不穷&#xff0c;这些都是促使程序员向另一个方向进行转型&#xff0c;那么&#xff0c;程…

程序员10年职业规划

从事Dotnet程序开发工作近10年了&#xff0c;从开始的月薪3k的小程序员菜鸟&#xff0c;到现在年薪60w的项目总经理&#xff0c;从战战兢兢的去各个公司应聘&#xff0c;到现在开始面试那些战战兢兢的小程序员&#xff0c;回想起这近十年来的经验&#xff0c;看着还是朝气蓬勃的…

女生做软件测试的职业规划,来说说女程序员的职业规划要怎么做

如果你是一名女程序员&#xff0c;你一定会为如何规划自己的职业生涯而感到苦恼。本期乔布 女程序员的职业规划 要怎么做。 关键词&#xff1a; 女程序员的职业规划 总体来说&#xff0c;女程序员的职业规划路线主要有四种&#xff1a;技术线路&#xff1b;业务路线&#xff1b…

女程序员的职业规划

女程序员的职业规划 引子 很多姐妹发微博评论留言给我&#xff0c;说希望我写一篇关于女程序员职业规划的文章。很惭愧&#xff0c;我自己的职业规划都还没亲自验证完毕&#xff0c;coder之路还在继续&#xff0c;在此仅仅分享我的所闻、所见、所学、所思&#xff0c;有…

Android程序媛大厂拧螺丝,未来职业如何规划?

作者&#xff1a;程军 上周有一位朋友咨询我职业规划问题。 我先介绍一下背景&#xff0c;她工作 2 年&#xff0c;985 本科毕业&#xff0c;目前在一家互联网大厂任职 Android工程师。 她主要咨询了我 4 个困惑问题&#xff0c;比如大厂拧螺丝怎么破&#xff1f;全年 996 没…

女神节-女性程序员有哪些好的职业发展路线

1、前言 祝天下作所有的女生节日快乐&#xff0c;在今天这个日子里&#xff0c;多陪陪自己的爱人、母亲&#xff0c;有时候不一定要礼物&#xff0c;真诚的对待和陪伴就是对她最好的爱。 最近为公司招聘测试岗位&#xff0c;岗位需求最好是女生&#xff0c;因为领导觉得在测…

一名女程序员的职业规划

前言&#xff1a; 在IT这个行业做了有几年了&#xff0c;身边的一些朋友有一部分已经转行了&#xff0c;也有部分正在为转行打基础做准备。所以我最近也在考虑这个问题&#xff0c;是应该继续做技术开发还是转产品之类的&#xff0c;还是直接转行做其他的职业。写下这篇博文&a…

c语言之运算符号

c语言的运算符有很多&#xff0c;希望做这份总结能够充分的利用这些运算符&#xff0c;编写出自己想要达到的效果 -----------------------------这是虚线还是实线&#xff0c;傻傻的分不清楚--------------------------------- 算数操作符 ###逻辑操作符 ###按位操作符 …

c语言运算符大全极其意义,C语言运算符大全

.. ;. C语言运算符大全 C语言的内部运算符很丰富&#xff0c;运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符&#xff1a;算术、关系与逻辑、位操作。另外&#xff0c;C还有一些特殊的运算符&#xff0c;用于完成一些特殊的任务。 2.6.1算术运算符 表2-…

单片机C语言基础运算符号

C语言中的运算符号分为10类&#xff1a;算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符和特殊运算符。 重点讲讲位操作运算符&#xff0c;因为相信其他大家也很容易掌握。 位操作运算符 C语言中六种位运…

C语言丨运算符号的三种用法(有示例代码)

&: 在C语言中有两种意思,一种是取地址符,是单目运算符;另一种是位运算符,表示“按位与”,是双目运算符。 1.用于指针赋值 #include<stdio.h> int main() {int a = 2; int*b;//定义一个整形指针 b = &a;//给指针赋值,使指针指向a的地址 printf("%d&…

C语言符号意思(看了必懂系列)

所有的努力都不会完全白费&#xff0c;你付出多少时间和精力&#xff0c;都是在对未来的积累。世界上什么都不公平&#xff0c;唯独时间最公平&#xff0c;你是懒惰还是努力&#xff0c;时间都会给出结果。 auto &#xff1a;声明自动变量 一般不使用 double &#xff1a;声明双…

c语言关系运算符号比较大小,有哪些c语言关系运算符号

有哪些c语言关系运算符号 发布时间&#xff1a;2020-07-27 11:57:56 来源&#xff1a;亿速云 阅读&#xff1a;97 作者&#xff1a;Leah 本篇文章给大家分享的是有关有哪些c语言关系运算符号&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家学习&#xff0c;希望大家阅…