文章目录
- 本节最终效果
- 前言
- 开始游戏
- 主角扣血和死亡
- 游戏结束
- 清屏效果
- 赢得比赛
- 角色选择界面
- 每个角色有自己的特点,及初始属性不一样
- 参考
- 源码
- 完结
本节最终效果
前言
本节紧跟着上一篇,主要实现不同游戏界面和不同角色选择。
开始游戏
简单绘制UI
修改默认禁用一起其他操作,包括玩家敌人和敌人生成器,游戏倒计时
if(!GameManager.instance.isLive) return;
修改GameManager
public void GameStart()
{
health = maxHealth;
uiLevelUp.Select(0);
Resume();
}
添加点击事件
效果
主角扣血和死亡
修改Player
void OnCollisionStay2D(Collision2D collision)
{
// 如果玩家已经死亡,则不执行接下来的逻辑
if (!GameManager.instance.isLive)
{
return;
}
// 对玩家的生命值进行递减
GameManager.instance.health -= Time.deltaTime * 10;
// 如果玩家生命值小于0,则进行相应处理
if (GameManager.instance.health < 0)
{
// 关闭当前物体所有子对象的渲染
for (int index = 0; index < transform.childCount; index++)
{
transform.GetChild(index).gameObject.SetActive(false);
}
// 播放死亡动画
animator.SetTrigger("Dead");
}
}
效果
游戏结束
简单绘制UI
修改GameManager
public GameObject uiResult;
public void GameOver()
{
StartCoroutine(GameOverRoutine());
}
IEnumerator GameOverRoutine()
{
// 设置玩家为死亡状态
isLive = false;
// 等待0.5秒
yield return new WaitForSeconds(0.5f);
uiResult.SetActive(true);
// 停止游戏逻辑或重置游戏状态
Stop();
}
public void GameRetry()
{
// 重新加载场景(假设索引为0的场景是起始场景)
SceneManager.LoadScene(0);
}
修改Player
// 播放死亡动画
animator.SetTrigger("Dead");
GameManager.instance.GameOver();
绑定点击事件
效果
清屏效果
可以复用子弹的功能,相当于生成了一个超高伤害和超大范围的子弹
赢得比赛
绘制UI,复用游戏结束UI即可
修改GameManager
public GameObject uiVictroy;
public GameObject enemyCleaner;
void Update()
{
//。。。
if (gameTime >= maxGameTime){
gameTime = maxGameTime;
GameVictroy();
}
}
public void GetExp()
{
//胜利了不需要经验
if (!GameManager.instance.isLive) return;
//。。。
}
public void GameVictroy()
{
StartCoroutine(GamevictroyRoutine());
}
IEnumerator GamevictroyRoutine()
{
// 设置玩家为死亡状态
isLive = false;
// 激活敌人清除器游戏对象
enemyCleaner.SetActive(true);
// 等待0.5秒
yield return new WaitForSeconds(0.5f);
// 激活 UI 结果游戏对象
uiVictroy.SetActive(true);
// 停止游戏逻辑或重置游戏状态
Stop();
}
配置参数
效果
角色选择界面
绘制UI,改的是前面的开始游戏按钮
修改逻辑GameManager
public int playerId;
public void GameStart(int id)
{
playerId = id;
health = maxHealth;
player.gameObject.SetActive(true);
uiLevelUp.Select(playerId % 2);
Resume();
}
修改Player,实现角色动画切换
public RuntimeAnimatorController[] animCon;
void Awake()
{
spriter = GetComponent<SpriteRenderer>();
animator = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>();
scanner = GetComponent<Scanner>();
hands = GetComponentsInChildren<Hand>();
}
private void OnEnable() {
animator.runtimeAnimatorController = animCon[GameManager.instance.playerId];
}
新角色动画,新建一个动画控制器覆盖器即可
配置不同动画参数,并且默认隐藏角色
修改点击事件,配置不同角色id
效果
每个角色有自己的特点,及初始属性不一样
新增Character
public class Character : MonoBehaviour
{
// 玩家速度
public static float Speed
{
get
{
return GameManager.instance.playerId == 0 ? 1.1f : 1f;
}
}
// 武器速度
public static float WeaponSpeed
{
get
{
return GameManager.instance.playerId == 1 ? 1.1f : 1f;
}
}
// 武器射速
public static float WeaponRate
{
get
{
return GameManager.instance.playerId == 1 ? 0.9f : 1f;
}
}
// 伤害值
public static float Damage
{
get
{
return GameManager.instance.playerId == 2 ? 1.2f : 1f;
}
}
// 数量
public static int Count
{
get
{
return GameManager.instance.playerId == 3 ? 1 : 0;
}
}
}
修改Player
private void OnEnable() {
speed *= Character.Speed;
animator.runtimeAnimatorController = animCon[GameManager.instance.playerId];
}
修改Gear
void RateUp()
{
Weapon[] weapons = transform.parent.GetComponentsInChildren<Weapon>(); // 获取所有子物体中的武器组件
foreach (Weapon weapon in weapons)
{
switch (weapon.id)
{
case 0:
float speed = 150 * Character.WeaponSpeed;
weapon.speed = speed + speed * rate;
break;
default:
speed = 0.5f * Character.WeaponRate;
weapon.speed = speed * (1f - rate);
break;
}
}
}
void SpeedUp()
{
float speed = 3.0f * Character.Speed;
GameManager.instance.player.speed = speed * (1.0f + rate);
}
修改Weapon
public void LevelUp(float damage, int count)
{
this.damage = damage * Character.Damage;
this.count += count;
if (id == 0) Batch();
// player.BroadcastMessage("ApplyGear");
}
public void Init(ItemData data)
{
//。。。
damage = data.baseDamage * Character.Damage; // 设置物品基础伤害
count = data.baseCount + Character.Count; // 设置物品基础数量
for (int index = 0; index < GameManager.instance.pool.prefabs.Length; index++)
{
if (data.projectile == GameManager.instance.pool.prefabs[index])
{
prefabId = index; // 设置投射物的预制体ID
break;
}
}
switch (id)
{
case 0:
speed = 150 * Character.WeaponSpeed; // 设置武器旋转的速度
Batch();
break;
default:
speed = 0.5f * Character.WeaponRate;
break;
}
//。。。
}
效果,小蓝移速高 小红射速快
参考
【视频】https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x
源码
源码在最后一节
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~