美文网首页多媒体和建模
C# unity3d 贪吃蛇 游戏 源码 及其感想

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

作者: 壹米玖坤 | 来源:发表于2017-03-20 23:01 被阅读733次

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

    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

    }

    }

    }

    相关文章

      网友评论

        本文标题:C# unity3d 贪吃蛇 游戏 源码 及其感想

        本文链接:https://www.haomeiwen.com/subject/lbjinttx.html