游戏介绍:
主人公在一个10*10方格中求生。
设定:
1、主人公每走一步消耗一点体力值。
2、主人公初始有10点体力值。
3、地图上会随机出现僵尸、补给品、障碍物。
4、主人公每走2步后僵尸行走一步。
5、如果僵尸遇见主人公将会攻击(僵尸可以行动时)。
6、有2种僵尸伤害分别为10点和20点体力值。
7、有2种补给品分别提供10点和20点体力值。
8、主人公可以打破障碍物但是会计入步数。
9、主人公到达出口则可进入下一关。
10、体力值耗尽则游戏结束。
GameObject:
Main Camera:摄像头
Player:主人公
Canvas:ui
Enemy1、Enemy2:僵尸
Floor1-8:地板
OutWall1-3:围墙
Wall1-8:障碍物
Food、Soda:补给品
GameManager:控制游戏进程
Aimation:
PlayerIdle:主人公行走动画
PlayerAttack:主人公攻击动画
Eenmy1Idle、Eenmy2Idle:僵尸行走动画
Eenmy1Attack、Eenmy2Attack:僵尸攻击动画
AimationController:
Player:
Enemy1(僵尸共用一个):
Scripts:
AudioManager:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioManager : MonoBehaviour {
private static AudioManager _instance;
public static AudioManager Instance {
get {
return _instance;
}
}
public float minPitch = 0.9f;
public float maxPitch = 1.1f;
public AudioSource efxSource;
public AudioSource bgSource;
private void Awake() {
_instance = this;
}
//让bgm播放
public void RandomPlay(params AudioClip[] clips) {
float pitch = Random.Range(minPitch, maxPitch);
int index = Random.Range(0, clips.Length);
AudioClip clip = clips[index];
efxSource.clip=clip;
efxSource.pitch=pitch;
efxSource.Play();
}
//关闭背景音乐
public void StopBgm() {
bgSource.Stop();
}
}
Enemy:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour {
private Transform player;
private Vector2 targetPosition;//僵尸移动的目标位置
private Rigidbody2D rigidbody;
private BoxCollider2D collider;
private Animator animator;
public float smoothing = 3;
public int lossFood = 10;
public AudioClip attackAudio;
void Start() {
player = GameObject.FindGameObjectWithTag("Player").transform;
targetPosition = transform.position;
rigidbody = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
collider = GetComponent<BoxCollider2D>();
GameManger.Instance.enemyList.Add(this);
}
//通过update控制僵尸移动
void Update() {
rigidbody.MovePosition(Vector2.Lerp(transform.position, targetPosition, smoothing * Time.deltaTime));
}
//僵尸移动或攻击
public void Move() {
Vector2 offset = player.position - transform.position;
if (offset.magnitude < 1.1f) {
//僵尸攻击主人公
animator.SetTrigger("Attack");
AudioManager.Instance.RandomPlay(attackAudio);
player.SendMessage("TakeDamage", lossFood);
}
else {
float x = 0,y = 0;
if (Mathf.Abs(offset.y) > Mathf.Abs(offset.x)) {
if (offset.y < 0) y = -1;
else y = 1;
}
else {
if (offset.x < 0) x = -1;
else x = 1;
}
//判断僵尸移动路线上是否有障碍物如果有则僵尸不动
collider.enabled = false;
RaycastHit2D hit = Physics2D.Linecast(targetPosition, targetPosition + new Vector2(x, y));
collider.enabled = true;
if (hit.transform == null||hit.collider.tag == "Soda" || hit.collider.tag == "Soda") {
targetPosition += new Vector2(x, y);
}
}
}
}
GameManager:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManger : MonoBehaviour {
private static GameManger _instance;
public static GameManger Instance {
get {
return _instance;
}
}
private Text foodText;
private Text failText;
private bool sleep = true;//判断僵尸是否可以行动(人类是否行走2步)
private Player player;
private MapManger mapManger;
private Image dayIamge;
private Text dayText;
public int level = 1;
public int food = 100;
public AudioClip dieClip;
[HideInInspector] public bool victory = false;//是否达到光卡成功条件
[HideInInspector] public List<Enemy> enemyList = new List<Enemy>();
private void Awake() {
_instance = this;
DontDestroyOnLoad(gameObject);
initGame();
}
//初始化游戏
void initGame() {
victory = false;
enemyList.Clear();
mapManger = GetComponent<MapManger>();
mapManger.InitMap();
foodText = GameObject.Find("FoodText").GetComponent<Text>();
failText = GameObject.Find("FailText").GetComponent<Text>();
failText.enabled = false;
UpdateFoodText(0);
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
dayIamge = GameObject.Find("DayImage").GetComponent<Image>();
dayText = GameObject.Find("DayText").GetComponent<Text>();
dayText.text = "Day " + level;
Invoke("HideBlack", 1);
}
//初始食物数量的ui
void UpdateFoodText(int foodChange) {
if(foodChange==0)
foodText.text = "Food : " + food;
else {
string str =(foodChange>0?"+":"")+ foodChange.ToString();
foodText.text = str + " Food:" + food;
}
}
//增加体力
public void AddFood(int count) {
food += count;
UpdateFoodText(count);
}
//减少体力
public void ReduceFood(int count) {
food -= count;
UpdateFoodText(-count);
if (food <= 0) {
failText.enabled = true;
AudioManager.Instance.StopBgm();
AudioManager.Instance.RandomPlay(dieClip);
}
}
public void OnPlayerMove() {
if (sleep) sleep =!sleep;
else {
sleep = !sleep ;
foreach(var enemy in enemyList) {
enemy.Move();
}
}
//关卡胜利
if (player.targetPos.x == mapManger.cols - 2 && player.targetPos.y == mapManger.rows - 2) {
victory = true;
Application.LoadLevel(Application.loadedLevel);
}
}
private void OnLevelWasLoaded(int scenelevel) {
++level;
initGame();
}
//隐藏游戏失败的ui
void HideBlack() {
dayIamge.gameObject.SetActive(false);
}
}
Loader:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Loader : MonoBehaviour {
public GameManger gameManager;
//加载gamemanager
private void Awake() {
if (GameManger.Instance == null)
GameObject.Instantiate(gameManager);
}
}
Player:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
private Rigidbody2D rigidbody;
private Animator animator;
private float restTimer = 0;
private BoxCollider2D collider;
[HideInInspector] public Vector2 targetPos = new Vector2(1, 1);
public float smoothing = 6;
public float restTime = 1;
public AudioClip chop1Audio;
public AudioClip chop2Audio;
public AudioClip step1Audio;
public AudioClip step2Audio;
public AudioClip soda1Audio;
public AudioClip soda2Audio;
public AudioClip food1Audio;
public AudioClip food2Audio;
void Start () {
rigidbody = GetComponent<Rigidbody2D>();
collider = GetComponent<BoxCollider2D>();
animator = GetComponent<Animator>();
}
//控制player运动
void Update () {
//游戏结束或者进入下一关直接退出
if (GameManger.Instance.food <= 0 || GameManger.Instance.victory == true) return;
//移动
rigidbody.MovePosition(Vector2.Lerp(transform.position, targetPos, smoothing * Time.deltaTime));
restTimer += Time.deltaTime;
if (restTimer < restTime) return;
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
if (h > 0) v = 0;
if (h != 0 || v != 0) {
GameManger.Instance.ReduceFood(1);
collider.enabled = false;
RaycastHit2D hit= Physics2D.Linecast(targetPos,targetPos+new Vector2(h,v));
collider.enabled = true;
if (hit.transform == null) {
targetPos += new Vector2(h, v);
AudioManager.Instance.RandomPlay(step1Audio, step2Audio);
}
else {
//player行走目标不同情况
switch (hit.collider.tag) {
case "OutWall":
break;
case "Wall":
animator.SetTrigger("Attack");
AudioManager.Instance.RandomPlay(chop1Audio, chop2Audio);
hit.collider.SendMessage("TakeDamage");
break;
case "Food":
GameManger.Instance.AddFood(10);
targetPos += new Vector2(h, v);
AudioManager.Instance.RandomPlay(step1Audio, step2Audio);
Destroy(hit.transform.gameObject);
AudioManager.Instance.RandomPlay(food1Audio, food2Audio);
break;
case "Soda":
GameManger.Instance.AddFood(20);
targetPos += new Vector2(h, v);
AudioManager.Instance.RandomPlay(step1Audio, step2Audio);
Destroy(hit.transform.gameObject);
AudioManager.Instance.RandomPlay(soda1Audio, soda2Audio);
break;
case "Enemy":
break;
}
}
GameManger.Instance.OnPlayerMove();
restTimer = 0;
}
}
//受到伤害
public void TakeDamage(int lossFood) {
GameManger.Instance.ReduceFood(lossFood);
animator.SetTrigger("Demage");
}
}
Wall:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Wall : MonoBehaviour {
public int hp = 2;
public Sprite damageSprite;
//被主人公攻击时候
public void TakeDamage() {
hp -= 1;
GetComponent<SpriteRenderer>().sprite = damageSprite;
if (hp <= 0) {
Destroy(this.gameObject);
}
}
}