汪wwwww

导航

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<Transform> Body = new List<Transform> ();//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<MeshRenderer> ().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
        }
    }
}

posted on 2016-11-11 17:54  汪wwwww  阅读(9823)  评论(0编辑  收藏  举报