欢迎光临
我们一直在努力

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

 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
        }
    }
}

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《C#unity3d贪吃蛇游戏源码及其感想》
文章链接:https://www.456zj.com/40983.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址