2D经典像素游戏 rougelike

游戏介绍:

主人公在一个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);
        }
    }
}


游戏运行截图:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值