简单逻辑图
游戏主要逻辑功能的实现逻辑。
玩家
1.移动功能
Input.GetAxisRaw();//用于形成方向
//处理移动的旋转方向
Rotation = Quaternion.Euler(0, 0, 旋转角);
transform.rotation = Rotation;
//移动
transform.Translate();
2.攻击功能
Instantiate(bulletPerfab, transform.position, Rotation)//Rotation为坦克的旋转角
3.死亡处理 销毁自身 初始化各参数 敌人 敌人的本质其实和玩家差不多,只不过移动方向和射击间隔是随机的。
**
子弹
** 首先我们要知道子弹分为敌人的子弹和主角的子弹,同一类型的子弹碰到同一类型的人物并不会销毁该对象。还有就是子弹脚本的设计,它既可以设置为一个脚本也可以设置为多个脚本。 设置为一个其实就是加了几个开关用来储存子弹的状态,下面是设置为一个脚本时的代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class bullet : MonoBehaviour
{
public bool isPlayerBullet=true;//是否是人物子弹
public bool Player12;//是玩家1还是玩家2的子弹
public bool isPenetrate;//是否可以击穿障碍物
void Update()
{
if (Player12)
{
transform.Translate(Vector3.up * PalyerManage.Instant.bulletspeed[0] * Time.deltaTime);
}
else
{
transform.Translate(Vector3.up * PalyerManage.Instant.bulletspeed[1] * Time.deltaTime);
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
switch (collision.gameObject.tag)
{
case "player":
if (!isPlayerBullet)
{
collision.gameObject.SendMessage("Death");
Destroy(gameObject);
}
break;
case "player2":
if (!isPlayerBullet)
{
collision.gameObject.SendMessage("Death");
Destroy(gameObject);
}
break;
case "Enemy":
if (isPlayerBullet)
{
if (Player12)
{
collision.gameObject.SendMessage("Death", 1);//SendMessage不能传0
}
else
{
collision.gameObject.SendMessage("Death",2);
}
Destroy(gameObject);
}
break;
case "hoom":
Destroy(gameObject);
collision.gameObject.SendMessage("IsDestroy");
PalyerManage.Instant.isGameOver = true;
break;
case "wall":
Destroy(gameObject);
Destroy(collision.gameObject);
break;
case "airWall":
Destroy(gameObject);
break;
case "barrier":
if (isPenetrate)
{
Destroy(gameObject);
Destroy(collision.gameObject);
}
else
{
Destroy(gameObject);
}
break;
default:
break;
}
}
}
地图
1.地形的初始化 通过各种地形的预制体来初始化地形,并贮存已有地形的坐标 2.出生特效之人物和敌人的初始化 通过仔细品味我们可以发现这和子弹的模式差不多,我们可以写一个脚本,然后通过开关来控制是生成敌人还是主角。
3.奖励的生成
奖励的生成没什么好说的,就是使用Instantiate,主要是各种奖励功能的实现。 1.(坦克)生命加1:这个比较简单,我们可以通过查找主角的标签,然后改变它的HP.
2.(手雷)销毁地图上所有敌人:第一种方式是每生成一个敌人就添加到一个定义好了的链表里,注意该链表一定是在地图里一直存在的游戏对象上,吃到该奖励后通过遍历该链表把不为空的敌人销毁。
第二种方式就是直接查找场景里标签为敌人的游戏对象,然后销毁。我个人比较赞同使用第一种方法,因为查找场景里标签为敌人的游戏对象需要遍历场景里所有对象,相对第一种方法明显效率比较低。当然还有其它方法实现该功,能这里就不细讲。
3.(闹钟)使地图上所有敌人静止(包含在该时段生成的敌人):这个其实我们在敌人的脚本里定义一个控制敌人的静态bool变量的开关,吃到该奖励后改变它的值,使其值改变,然后让他停止射击和移动。
4.(帽子)保护自己:主角一开始生成时就有一个保护罩,我们只需要重新调用一下它。
5.(工兵铲)保护家:我们可以使用两个链表来来储存两种家的墙,一种是可以打穿,一种是不可以。然后在游戏开始的时候把第二种墙隐藏,第一种显示,吃到第奖励时把第一种墙隐藏,第二种显示。 6.(星星)使坦克各属性变化:注意死亡后重新累计星星效果。
switch (PalyerManage.Instant.effect[0])
{
case 0:
//一颗攻速增加,坦克变形
Transform Palyer1 = GameObject.FindGameObjectWithTag("player").transform;
Palyer1.GetComponent<SpriteRenderer>().sprite = ChangeRole[0];
PalyerManage.Instant.AttackCD[0] -= 0.5f;
PalyerManage.Instant.effect[0]++;
break;
case 1:
//2颗攻击增加
PalyerManage.Instant.Attack[0] += 1;
PalyerManage.Instant.effect[0]++;
break;
case 2:
//3颗坦克变形可以打障碍
Palyer1 = GameObject.FindGameObjectWithTag("player").transform;
Palyer1.GetComponent<SpriteRenderer>().sprite = ChangeRole[1];
PalyerManage.Instant.effect[0]++;
break;
case 3:
//四颗攻速增加
PalyerManage.Instant.AttackCD[0] -= 0.25f;
PalyerManage.Instant.effect[0]++;
break;
case 4:
//5颗坦克变形,攻击增加
Palyer1 = GameObject.FindGameObjectWithTag("player").transform;
Palyer1.GetComponent<SpriteRenderer>().sprite = ChangeRole[2];
PalyerManage.Instant.effect[0]++;
break;
default:
break;
}
PalyerManage.Instant.speed[0] += 0.5f;//吃到星星奖励后移动速度增加
PalyerManage.Instant.bulletspeed[0] += 0.5f;//吃到星星奖励后射出的子弹速度增加
传递游戏数据
(1)在游戏的开始界面,当我们触发开始按钮使通过 PlayerPrefs.Set数据类型()设置游戏数据。
PlayerPrefs.SetInt("Effect", 0);
PlayerPrefs.SetInt("HP", 3);
PlayerPrefs.SetInt("Attack", 1);
PlayerPrefs.SetFloat("AttackCD", 1);
(2)生成主角时传入数据。
HP[0] = PlayerPrefs.GetInt("HP", 3);
Attack[0] = PlayerPrefs.GetInt("Attack", 1);
AttackCD[0] = PlayerPrefs.GetFloat("AttackCD", 1);
effect[0] = PlayerPrefs.GetInt("Effect", 0);
(3)赢得游戏时,储存当前游戏数据
public void Win()
{
if (EnemyNum<=0)
{
PlayerPrefs.SetInt("Effect", PalyerManage.Instant.effect[0]);
PlayerPrefs.SetInt("HP", PalyerManage.Instant.HP[0]);
PlayerPrefs.SetInt("Attack", PalyerManage.Instant.Attack[0]);
PlayerPrefs.SetFloat("AttackCD", PalyerManage.Instant.AttackCD[0]);
}
}
(4)失败时加载游戏的开始场景
下面是游戏运行的视频。 视频