zoukankan      html  css  js  c++  java
  • Unity经典游戏教程之:贪吃蛇

    版权声明:

    • 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客"(微信号:unitymaker)
    • 您可以自由转载,但必须加入完整的版权声明!

    贪吃蛇与方块

    • 主要玩法:贪吃蛇吃食物,吃到食物后根据相应数值增加身体长度,如果贪吃蛇碰到方块后,根据方块的数值逐渐减少贪吃蛇身体长度,如果贪吃蛇长度为0时,游戏结束,场景中会有一下墙壁阻挡贪吃蛇的左右移动。
    • 角色操作:点击鼠标左键,并在屏幕上左右移动,可以控制贪吃蛇在场景中左右移动,贪吃蛇要吃食物,并且要躲避方块,或者消除方块。
    • 游戏计分规则:贪吃蛇要撞击方块(消除方块),方块上都有对应数值,贪吃蛇消除一个方块,根据方块上的数值增加分数。
    • 原版游戏画面:

    image
    image
    image
    image
    image

    实际游戏运行画面:

    image
    image
    image

    通过脚本固定窗口大小(此脚本可以挂在到任意的游戏对象上):

    	void Start () 
        {
            Screen.SetResolution(768, 1024, false);
    	}
    

    贪吃蛇生成:

        public void SpawnBodyParts()
        {
            firstPart = true;
    
            //Add the initial BodyParts
            for (int i = 0; i < initialAmount; i++)
            {
                //Use invoke to avoid a weird bug where the snake goes down at the beginning.
                Invoke("AddBodyPart", 0.1f);
            }
        }
    
    

    image
    image

    贪吃蛇移动:

    • 主要就是检测鼠标是否在屏幕上,通过鼠标左键按下并左右移动来控制贪吃蛇的左右移动,并不用定位坐标,仅检测鼠标左右移动来控制贪吃蛇的左右移动。
    • 贪吃蛇可以会自动向前移动,碰到方块会停顿一下,方块消除后并且贪吃蛇不为0,则贪吃蛇继续向前移动,如果贪吃蛇为0时,游戏结束。
      float curSpeed = speed;
      
              //Always move the body Up
              if(BodyParts.Count > 0)
                  BodyParts[0].Translate(Vector2.up * curSpeed * Time.smoothDeltaTime);
      
      
              //check if we are still on screen
              float maxX = Camera.main.orthographicSize * Screen.width / Screen.height;
      
              if (BodyParts.Count > 0)
              {
                  if (BodyParts[0].position.x > maxX) //Right pos
                  {
                      BodyParts[0].position = new Vector3(maxX - 0.01f, BodyParts[0].position.y, BodyParts[0].position.z);
                  }
                  else if (BodyParts[0].position.x < -maxX) //Left pos
                  {
                      BodyParts[0].position = new Vector3(-maxX + 0.01f, BodyParts[0].position.y, BodyParts[0].position.z);
                  }
              }
      
      

    贪吃蛇吃食物:

    • 贪吃蛇吃到食物后,根据食物上的数值增加身体。

      public class FoodBehavior : MonoBehaviour 
      {
      
          [Header("Snake Manager")]
          SnakeMovement SM;
      
          [Header("Food Amount")]
          public int foodAmount;
      
          // Use this for initialization
          void Start () 
          {
              SM = GameObject.FindGameObjectWithTag("SnakeManager").GetComponent<SnakeMovement>();
      
              foodAmount = Random.Range(1, 10);
      
              transform.GetComponentInChildren<TextMesh>().text = "" + foodAmount;
          }
      
          // Update is called once per frame
          void Update () 
          {
              if (SM.transform.childCount > 0 && transform.position.y - SM.transform.GetChild(0).position.y < -10)
                  Destroy(this.gameObject);
          }
      
          private void OnTriggerEnter2D(Collider2D collision)
          {
              Destroy(this.gameObject);
          }
      }
      

    菜单系统:

    image

    计分:

    ```
    	void Start () 
        {
            //Initially, set the menu and Score is null
            
            SetMenu();
            SCORE = 0;
    
            //Initialize some booleans
            speedAdded = false;
    
            //Load the best score
            BESTSCORE = PlayerPrefs.GetInt("BESTSCORE");
    	}
    
    ```
    

    粒子系统:

    -贪吃蛇碰撞方块就会触发粒子系统。

    image

    摄像机控制:

    ```
    public class CameraMovement : MonoBehaviour 
    {
    
        [Header("Snake Container")]
        public Transform SnakeContainer;
    
        Vector3 initialCameraPos;
    
    	// Use this for initialization
    	void Start () 
        {
    
            initialCameraPos = transform.position;	
    	}
    	
    	// Update is called once per frame
    	void Update () 
        {
            if(SnakeContainer.childCount > 0)
                transform.position = Vector3.Slerp(transform.position, 
                    (initialCameraPos + new Vector3(0,SnakeContainer.GetChild(0).position.y - Camera.main.orthographicSize/2,0)),
                    0.1f);
    	}
    }
    ```
    

    image

    更多知识、教程、源码请进↓↓↓
    优梦创客工坊

    精品内容推送请搜索↓↓↓
    微信公众号:优梦创客

    免费直播、VIP视频请进↓↓↓
    优梦创客课堂

    游戏开发交流群↓↓↓
    游戏开发交流群

  • 相关阅读:
    读取csv文件时编码错误
    ubuntu keras
    ubuntu19.1 tensorflow
    随机数random
    获取文件夹下所有文件名
    np.random.send()
    tensorflow---识别图像特征(吴恩达课程)
    Springboot项目热部署-Devtools
    Hadoop综合大作业
    分布式文件系统HDFS 练习
  • 原文地址:https://www.cnblogs.com/raymondking123/p/8424661.html
Copyright © 2011-2022 走看看