贪吃蛇(基于unity5.6.6f2)
- 好久没更新过了,最进事很乱,有出去了一趟还没网,以后会一星期更新一次
- 先上图片
- 文档
有些比较细的没有进行标注
- 下面贴代码
- 主UI
-
public class MainUI : MonoBehaviour {
//开始按钮
private Button go_Button;
//皮肤组
private IEnumerable<Toggle> SkinComtorller;
//模式组
private IEnumerable<Toggle> ModelContorller;
//上一次分数
private Text last_Text;
//最高分数
private Text best_Text;
void Start () {
GetMyComponent();
//最好一步一步来
GameManger.Instance.TakeOut("best_Score");
if (GameManger.Instance.best_Score!= "")
{
print(GameManger.Instance.best_Score);
best_Text.text = "最好: 长度" + GameManger.Instance.SocreData(GameManger.Instance.best_Score)[1] + ", 分数" +
GameManger.Instance.SocreData(GameManger.Instance.best_Score)[0];
GameManger.Instance.TakeOut("last_Score");
last_Text.text = "上次: 长度" + GameManger.Instance.SocreData(GameManger.Instance.last_Score)[1] + ", 分数" +
GameManger.Instance.SocreData(GameManger.Instance.last_Score)[0];
}
}private void GetMyComponent()
{
//获取按钮绑定点击事件
go_Button = transform.Find("BgPanel/HomePage/GoButton").GetComponent<Button>();
go_Button.onClick.AddListener(() => GoButtonOnClick());
//获取皮肤组中的所有toggle
SkinComtorller = transform.Find("BgPanel/InspectorPanel/SkinComtorller").GetComponent<ToggleGroup>().ActiveToggles();
//获取模式组中的所有toggle
ModelContorller = transform.Find("BgPanel/InspectorPanel/ModelContorller").GetComponent<ToggleGroup>().ActiveToggles();
//获取上一次分数文本
last_Text = transform.Find("BgPanel/InspectorPanel/ScoreContorller/LastText").GetComponent<Text>();
//获取坐高的分数文本
best_Text = transform.Find("BgPanel/InspectorPanel/ScoreContorller/BestText ").GetComponent<Text>();
}
///记录选中的皮肤
private void SeletSkin()
{
foreach (Toggle t in SkinComtorller)
{
if (t.isOn)
{
switch (t.name)
{
case "ScienceToggle":
GameManger.Instance.skin = Skin.蓝色;
break;
case "YellowToggle":
GameManger.Instance.skin = Skin.黄色;
break;
}
}
}
}
///记录选中的模式
private void SeletModel()
{
foreach (Toggle t in ModelContorller)
{
if (t.isOn)
{
switch (t.name)
{
case "BoundaryToggle":
GameManger.Instance.model = Model.边界模式;
break;
case "FreedomToggle":
GameManger.Instance.model = Model.自由模式;
break;
}
}
}
}
//点击事件
private void GoButtonOnClick()
{
SceneManager.LoadScene("MainGame");
//进入时将值记录
SeletModel();
SeletSkin();
}
}
- 游戏管理
-
///皮肤
public enum Skin
{
黄色,
蓝色
}
///模式
public enum Model
{
边界模式,
自由模式
}
public class GameManger : MonoBehaviour {
//设置为单例
private static GameManger instance;
public static GameManger Instance
{
get { return instance; }
}
private void Awake()
{
instance = this;
}
//定义皮肤变量
public Skin skin;
//定义模式变量
public Model model;
//定义上一次的分数变量
public string last_Score;
//定义最高分的分数变量
public string best_Score;void Start () {
//在跳转场景的时候对该物体不进行销毁
DontDestroyOnLoad(gameObject);
}void Update () {
}
///数据存储
public void Storage(string key,string data)
{
PlayerPrefs.SetString(key, data);
}
//数据取出
public void TakeOut(string key)
{
string data = PlayerPrefs.GetString(key);
switch (key)
{
case "skin":
SkinData(data);
break;
case "model":
ModelData(data);
break;
case "last_Score":
last_Score = data;
break;
case "best_Score":
best_Score = data;
break;
}
}
//皮肤数据处理
private void SkinData(string data)
{
switch (data)
{
case "黄色":
skin = Skin.黄色;
break;
case "蓝色":
skin = Skin.黄色;
break;
}
}
//模式数据处理
private void ModelData(string data)
{
switch (data)
{
case "边界模式":
model = Model.边界模式 ;
break;
case "自由模式":
model = Model.自由模式; ;
break;
}
}
//分数处理
public string[] SocreData(string data)
{
string[] sOl = data.Split(':');
return sOl;
}
}
- 食物管理
public class FoodManger : MonoBehaviour {
//设置为单例模式
private static FoodManger instance;
public static FoodManger Instance
{
get { return instance; }
}
private void Awake()
{
instance = this;
}
//食物的预设
private GameObject food_Prefabs;
//不同类型的食物
private Sprite [] food_Sprites;
void Start () {
food_Prefabs = Resources.Load<GameObject>("Food");
food_Sprites = Resources.LoadAll<Sprite>("Foods");
//初始生成食物
CreatFood();
}
void Update () {
}
//生成食物
public void CreatFood()
{
//2D生成的方法
GameObject go = Instantiate(food_Prefabs,transform);
//设置位置
go.transform.localPosition = new Vector3(280 + (30 * Random.Range(0, 32)), 30 + (30 * Random.Range(0, 22)), 0);
//设置图片
go.GetComponent<Image>().sprite = food_Sprites[Random.Range(0, food_Sprites.Length)];
}
}
- 游戏UI
-
public class InspectorManger : MonoBehaviour {
public Text mode_Text;
public Text score_Text;
public Text length_Text;
public Button home_Button;
public Button pase_Button;
private bool ispase = false;
private Sprite[] pases;
void Start () {
pases = Resources.LoadAll<Sprite>("Pase");
//获取组件
GetMyComponent();
home_Button.onClick.AddListener(() => SceneManager.LoadScene("MainUI")
);
pase_Button.onClick.AddListener(GamePase);
}private void GamePase()
{
if (!ispase)
{
Time.timeScale = 0;
pase_Button.transform.GetChild(0).GetComponent<Image>().sprite = pases[1];
}
else
{
Time.timeScale = 1;
pase_Button.transform.GetChild(0).GetComponent<Image>().sprite = pases[0];
}
ispase = !ispase;
}
//获取组件
private void GetMyComponent()
{
mode_Text = transform.Find("ModelText").GetComponent<Text>();
score_Text = transform.Find("ScoreText").GetComponent<Text>();
length_Text = transform.Find("LengthText").GetComponent<Text>();
home_Button = transform.Find("ButtonManger/HomeButton").GetComponent<Button>();
pase_Button = transform.Find("ButtonManger/PaseButton").GetComponent<Button>();
}
}
- 蛇的移动与一部分管理(这个脚本内容有点杂糅了)
-
public enum Direction
{
横向,
纵向
}
public class SnakeMove : MonoBehaviour {
//延时移动时间间隔
[Range(0, 1)]
public float timeInterval;
//当前移动间隔
private float nowTime;
//当前移动方向
public static Direction direction;
//方向变量
private int TurnX = 1;
private int TurnY = 0;
//蛇的所有身体
private List<Vector3> snakPos = new List<Vector3>();
//蛇身
private GameObject SnakeBandly;
//当前长度
private int score = 0;
//当前分数
public int length = 0;
private InspectorManger inspector;
//存储蛇身图片
private Sprite[] bandlySprite;
void Start () {
//初始化当前间隔
nowTime = timeInterval;
//初始化当前方向
direction = Direction.横向;
//延时调用时蛇头进行移动
InvokeRepeating("SnakeMoveHandel", 1, timeInterval);
//添加当前位置
snakPos.Add(transform.position);
//加载蛇身
SnakeBandly = Resources.Load<GameObject>("SnakeBandly");
//加载资源
SnakBandlySprite();
//获取分数与长度的管理
inspector = transform.parent.parent.GetChild(0).GetComponent<InspectorManger>();
}
void Update () {
//变速
ChangeSpeed();
//转向
SnakeHandTurn();
}
///加载蛇身资源
void SnakBandlySprite()
{
switch (GameManger.Instance.skin)
{
case Skin.黄色:
bandlySprite = Resources.LoadAll<Sprite>("Yellow");
GetComponent<Image>().sprite = Resources.Load<Sprite>("sh02");
break;
case Skin.蓝色:
bandlySprite = Resources.LoadAll<Sprite>("blue");
GetComponent<Image>().sprite = Resources.Load<Sprite>("sh01");
break;
}
}
///改变蛇的速度
void ChangeSpeed()
{
if (timeInterval != nowTime)
{
CancelInvoke("SnakeMoveHandel");
nowTime = timeInterval;
InvokeRepeating("SnakeMoveHandel", 0, timeInterval);
}
}
///控制蛇进行转向
void SnakeHandTurn()
{
if (Input.GetMouseButtonDown(0))
{
//为了在点击按钮不触发转向
if (Input.mousePosition.x > 280 && Input.mousePosition.y > 30)
{
switch (direction)
{
case Direction.横向:
if (Input.mousePosition.y > transform.localPosition.y)
{
//将蛇头方向与移动方向改为向上移动
transform.localRotation = Quaternion.Euler(Vector3.zero);
TurnX = 0;
TurnY = 1;
}
else
{
//将蛇头方向与移动方向改为向下移动
transform.localRotation = Quaternion.Euler(new Vector3(0, 0, -180));
TurnX = 0;
TurnY = -1;
}
direction = Direction.纵向;
break;
case Direction.纵向:
if (Input.mousePosition.x > transform.localPosition.x)
{
//将蛇头方向与移动方向改为向右移动
transform.localRotation = Quaternion.Euler(new Vector3(0, 0, -90));
TurnX = 1;
TurnY = 0;
}
else
{
//将蛇头方向与移动方向改为向左 移动
transform.localRotation = Quaternion.Euler(new Vector3(0, 0, 90));
TurnX = -1;
TurnY = 0;
}
direction = Direction.横向;
break;
}
}
}
}
///是蛇进行移动
void SnakeMoveHandel()
{
transform.localPosition += new Vector3(30*TurnX, 30*TurnY, 0);
ModelSelet();
UpdateSnakeBandly();
}
///加长身体
public void AddSnakeBandly()
{
GameObject go = Instantiate(SnakeBandly, transform.parent);
go.transform.position = snakPos[snakPos.Count - 1];
print(length % 2);
go.GetComponent<Image>().sprite = bandlySprite[length%2];
if (transform.parent.childCount > 2)
{
//将自身添加进去
snakPos.Add(go.transform.position);
}
}
///模式选择
private void ModelSelet()
{
if (GameManger.Instance.model == Model.自由模式)
{
transform.parent.parent.Find("BroundManger").gameObject.SetActive(false);
if (transform.localPosition.x <= 250)
{
transform.localPosition = new Vector3(1250, transform.localPosition.y);
}
else if (transform.localPosition.x >= 1280)
{
transform.localPosition = new Vector3(280, transform.localPosition.y);
}
else if (transform.localPosition.y >= 720)
{
transform.localPosition = new Vector3(transform.localPosition.x, 30);
}
else if (transform.localPosition.y <= 0)
{
transform.localPosition = new Vector3(transform.localPosition.x, 690);
}
}
}
///更新蛇身的位置
void UpdateSnakeBandly()
{
if (snakPos.Count >=1&&transform.parent.childCount>1)
{
for (int i = 0; i < snakPos.Count; i++)
{
transform.parent.GetChild(i + 1).position = snakPos[i];
}
snakPos.Insert(0, transform.position);
snakPos.RemoveAt(snakPos.Count - 1);
}
else
{
snakPos[0] = transform.position;
}
}
///增加分数与长度
public void AddScoreAddLength(int min,int max)
{
int num = Random.Range(min, max);
length++;
score += num*10;
//同步UI
inspector.length_Text.text = "长度:\n" + length;
inspector.score_Text.text = "分数:\n" + score;
}
///原始增加
public void AddScoreAddLength()
{
length++;
score+= 10;
inspector.length_Text.text = "长度:\n" + length;
inspector.score_Text.text = "分数:\n" + score;
}
///判断分数或者长度将数据存储
public void ScoreOrLength()
{
//取出最高分
GameManger.Instance.TakeOut("best_Score");
if (GameManger.Instance.best_Score != "")
{
string best = GameManger.Instance.best_Score;
//将分数与长度切割开
string[] sOl = GameManger.Instance.SocreData(best);
//如果比最高分高
if (int.Parse(sOl[0]) < score)
{
//覆盖最高分
GameManger.Instance.Storage("best_Score", score + ":" + length);
}
}
else
{
//当最开始时直接将当前分数置为最高分
GameManger.Instance.Storage("best_Score", score + ":" + length);
}
//存储本次的分数
GameManger.Instance.Storage("last_Score", score + ":" + length);}
} - 蛇的碰撞的管理
- public class SnakeManger : MonoBehaviour {
private SnakeMove snake;
private GameObject Fxp;
private void Start()
{
snake = GetComponent<SnakeMove>();
Fxp = Resources.Load<GameObject>("ExpFbx");
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Food"))
{
//生成新的食物
FoodManger.Instance.CreatFood();
//蛇身加长
snake.AddSnakeBandly();
snake.AddScoreAddLength();
//销毁现在的食物
Destroy(collision.gameObject);
}
else if (collision.CompareTag("Wall"))
{
snake.ScoreOrLength();
//重新开始
StartCoroutine("SnakeDie");
}
else if (collision.CompareTag("Bandly") && snake.length > 2)
{
snake.ScoreOrLength();
StartCoroutine("SnakeDie");
}
}
IEnumerator SnakeDie()
{
Instantiate(Fxp);
yield return new WaitForSeconds(1);
SceneManager.LoadScene("MainGame");
}
//
} - 最后来贴一下工程、安装包X-mind
- X-mind链接:https://pan.baidu.com/s/1Qvl6r-AJ1gjDSHYEiTNWGQ
提取码:pjev - 安装包链接:https://pan.baidu.com/s/1hH6ZA5X-j9Wtl0JGsn_ooA
提取码:bbhe - 工程链接:https://pan.baidu.com/s/1KQPuI654_6iBBvtoeWOXug
提取码:an8e