C# unity3d 贪吃蛇 游戏 源码 及其感想

这个游戏的设计过程是这样的:

1,创建 🐍的身体,在 u3d里我只是用一个小方块表示 设计好蛇头后就添加meterial 这样蛇的基本元素都有了

2,创建地图,在这个项目里,我是使用一个 3d projiect 叫做 Quad的对象。然后要将地图大小改变为50,50.就是将该对象的scale改为50,50,1

3,创建食物,也是新建一个小方块,在tag那里添加新标签,填为 Food

4,创建body,还是一个小方块, 在tag那里添加新标签,填为 Body

方法上难点

1.触发器的使用,记住 OnTriggerEnter的使用,前提是两个碰撞的对象,必须其一个有rigidbody刚体组件,然后其中一个(不是另外一个 是两个中的一个)必须要勾上Is Trigger,两个不冲突,就可以了。设计碰撞器的大小,也是个细活。

在这里我只是使用了 Box Collider的组件,在完成路上曾经将🐍的Is Trigger打开,所以跟地图Quad冲突了,所以导致不断刷新这个场景。

2.一个方法  叫做other.gameObject.CompareTag ("Food"),我在OnTriggerEnter里的主要部分。

检测是否碰到一个Tag是否为Food的对象,然后检测到就将其删除,并延伸自己的身体。在后面后几次开发中都使用到,是个很重要的方法。

具体使用方法为

C#⇒ bool CompareTag(string tag);

Is this game object tagged with /tag/?

3.蛇的身体的移动,见到概括 就是当蛇 吃到食物后,在下一帧中延长了身体.蛇的身体是保存在一个集合中去的,还有最重要的一点!就是

用一个Vector3 VPosition记录蛇在移动前的位置,然后移动蛇,在原地生成一个body,位置为VPosition,然后lis.Insert(0,g)//g为body那个对象

((GameObject)list[list.Count-1]).transform.position = VPostion;//这句则是将当前集合最后一个元素赋值为VPosition

list.Insert (0, list [list.Count - 1]);//然后在集合的0位置插入最后一个元素

这样的话,g就排到了集合的第二个,而最后一个元素排到了第一个,

list.RemoveAt (list.Count-1);

然后删除集中中最后的元素,整个蛇移动的过程 和吃食物生成蛇的过程就清晰了。

代码最后 还有两段小UI,就不放上来了。

第一次记录自己的u3d开发过程,以后有经验后,应该不会这样全部详细保留下来了,主要供自己学习使用,代码未优化,只是达到实现效果而已。

==================================究极无敌华丽分界线==================================using UnityEngine;

using System.Collections;

using System.Diagnostics;

using UnityEngine.SceneManagement;

using System.Collections.Generic;

using System.Linq;

using UnityEngine.UI;

public class SnakeMove : MonoBehaviour {

List Body = new List ();//Transform的表

public GameObject BodyObject;

public GameObject sFood;

//updown Y轴 left down是x轴  forward back是z 轴

Vector3 postion = Vector3.up;

private bool s = false;

// Use this for initialization

public float speed=0.1f;

public float time = 0;

//public float time0 =1;

//    public float xlimit = 25.5f;

//    public float ylimit = 25.5f;

public int xlimit = 25;

public int ylimit = 25;

//伤害数值

public int Value;

//目标位置

private Vector3 mTarget;

//屏幕坐标

private Vector3 mScreen;

//文本宽度

public float ContentWidth = 100;

//文本高度

public float ContentHeight = 50;

//GUI坐标

private Vector2 mPoint;

//炫酷的字体

GUIStyle frontStyle = new GUIStyle();

public Text text;

Vector3 VPostion;

public GameObject body1;

public ArrayList list = new ArrayList();

private bool isEated = false;

void Start () {

//Time.timeScale=1;

//time = Time.time + time;

//InvokeRepeating 从第一秒开始,每隔四秒调用一次

InvokeRepeating ("Food", 1, 4);

InvokeRepeating ("Move", speed, speed);

//获取目标位置

mTarget =transform.position;

//获取屏幕坐标

mScreen =Camera.main.WorldToScreenPoint(mTarget);

//将屏幕坐标转化为GUI坐标

mPoint = new Vector2(mScreen.x,Screen.height-mScreen.y);

//

Value =0;

}

// Update is called once per frame

void Update () {

if(Input.GetMouseButtonDown(0))

Time.timeScale=1;

if (Input.GetKeyDown (KeyCode.D)&&postion!=Vector3.left)

{

postion = Vector3.right;

}

if (Input.GetKeyDown (KeyCode.A)&&postion!=Vector3.right)

{

postion = Vector3.left;

}

if (Input.GetKeyDown (KeyCode.S)&&postion!=Vector3.up)

{

postion = Vector3.down;

}

if (Input.GetKeyDown (KeyCode.W)&&postion!=Vector3.down)

{

postion = Vector3.up;

}

//Time.tiem 系统时间

//        if (time<=Time.time)

//        {

//            transform.Translate (postion);

//            time += 1;

//            //time 越小 速度越快

//        }

//Random r = new Random ();

//OnTriggerEnter();

}

void Move()

{

//transform.Translate (postion);

VPostion = transform.position;

transform.Translate (postion); //Transform.Translate平移 向某方向移动物体多少距离

if (isEated)

{

GameObject g = (GameObject)Instantiate(body1,VPostion,Quaternion.identity);

g.GetComponent ().material.color = new Color (Random.Range (0, 1.0f), Random.Range (0, 1.0f), Random.Range (0, 1.0f));

list.Insert (0, g);//将一个项插入指定索引处的 IList<(Of <(T>)>)。

//将元素插入 ArrayList 的指定索引处。 可在任意位置插入。

isEated = false;

}

else if (list.Count>0)

{

//            //最后一个元素的位置赋值给新的位置

//            //最后一个元素插入在第一个元素地址

//            //删除最后一个元素

((GameObject)list[list.Count-1]).transform.position = VPostion;

list.Insert (0, list [list.Count - 1]);//在0的位置插入一个

list.RemoveAt (list.Count-1);//移除 ArrayList 的指定索引处的元素。

}

}

void Food()

{

System.Random r = new System.Random ();

float x = r.Next (-xlimit,xlimit);

float y = r.Next (-ylimit,ylimit);

//        float x = Random.Range(-xlimit,xlimit);

//        float y = Random.Range (-ylimit, ylimit);

Instantiate (sFood, new Vector2 (x, y), Quaternion.identity);

}

void OnTriggerEnter(Collider other)

{

if (other.gameObject.CompareTag ("Food"))

{

if(!isEated)

Value++;

isEated = true;

Destroy (other.gameObject);

}

else

{

Time.timeScale=0;

SceneManager.LoadScene (0);

}

text.text = "Score :" + Value;

}

void OnGUI()

{

//保证目标在摄像机前方

if (mScreen.z > 0)

{

//GUI.color = Color.blue;

//内部使用GUI坐标进行绘制

frontStyle.fontSize=40;

frontStyle.normal.background = null;//设置背景填充

frontStyle.normal.textColor = new Color (100, 0, 128);//设置字体颜色

GUI.Label(new Rect(30,0,ContentWidth,ContentHeight),"分数为"+Value.ToString(),frontStyle);

//                  mPoint.x,mPoint.y

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容