制作2D小游戏 “别踩白块儿”

编程入门 行业动态 更新时间:2024-10-18 16:53:15

制作2D小游戏 “别踩白<a href=https://www.elefans.com/category/jswz/34/1715600.html style=块儿”"/>

制作2D小游戏 “别踩白块儿”

制作2D小游戏 “别踩白块儿” 首先,先切换为安卓的运行平台File->Build Settings->Android->Switch platform(切换平台)

然后,选择想要的分辨率,一般的常用分辨率都存在,如果现存的分辨率都不满意,可以点击最下的“+”进行分辨率的创建。在这里选择最常用的480×800的分辨率。然后拖动图片到场景中,调整位置,成功制作出一个开始界面。

2D游戏里的小细节需注意的地方:
在2D开发当中,图片的属性中有一个Sprite Rendered属性,它里面相较于3D的Sprite Rendered属性多了一个Order in Layer属性值,这个是用来设置层级显示先后的,越大越靠前,越小越靠后。


之后为Start添加名为StartButton的代码,对Start图片进行浮动的控制。下面为其代码:

public class Floating : MonoBehaviour
{
    private float radian = 0;           //私有弧度值
    public float perRadian = 0.02f;     //每次变化的弧度值
    public float radius = 0.2f;         //半径值

    private Vector3 oldPosition;        //基准点,记录初始位置

    void Start()
    {
        oldPosition = transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        radian += perRadian;            //改变弧度值
        float dy = Mathf.Cos(radian) * radius;   //通过弧度值来控制"Start"Button的运动
        transform.position = oldPosition + new Vector3(0, dy, 0);   //把弧度的偏移量与原位置相加,使之进行上下滑动
    }
}

添加游戏运行时图片作为背景,并添加一个空物体GameObject重命名为GameController并创建一个相同名称的代码来作为游戏的控制器(后面简称控制器)挂在GameController上。其代码如下:
注意:为什么把一个浮动的功能单独写了一个类来实现,因为它可以复用,我们可以通过Unity的主键机制,把一个功能点写入一个类,然后拖入想要加入的对象当中,减少工程消耗的时间。
public class GameController : MonoBehaviour
{
    public static int score = 0;        //表示游戏中的分数
    public static bool showScore = false;   //是否显示分数
    public GameObject startUI;              //开始界面
    public GameObject gameUI;               //游戏界面
    public GameObject container;            //方块的父物体

    public GameObject whiteBlock;
    public GameObject[] normalBlock;
    public bool startGame = false;          //用于判断是否游戏开始,用来处理返回按钮的两种操作

    private ArrayList blocks;           //用于储存已实例化的方块

    //进入游戏界面
    public void EnterGameUI()
    {
        startGame = true;
        //游戏开始,绘制游戏需要的GUI
        showScore = true;
        startUI.SetActive(false);
        gameUI.SetActive(true);
        //开始游戏
        StartGame();
    }

    //返回主界面
    public void ExitStartUI()
    {
        startGame = false;
        startUI.SetActive(true);
        gameUI.SetActive(false);
        //不绘制GUI
        showScore = false;
        Clean();
        //重置分数
        score = 0;
    }

    private void StartGame()
    {
        blocks = new ArrayList();
        for (int rowIndex = 0; rowIndex < 4; rowIndex++)
        {
            AddBlock(rowIndex);
        }
    }

    //在指定的行里添加一个方块儿
    void AddBlock(int rowIndex)
    {
        float randomNum = Random.Range(0f, 1f);
        GameObject prefab = randomNum > 0.8f ? whiteBlock : normalBlock[4];


        GameObject o = Instantiate(prefab) as GameObject;
        o.transform.parent = container.transform;
        Block b = o.GetComponent<Block>();
        int columnIndex = Random.Range(0, 4);
        b.SetPosition(columnIndex, rowIndex);


        //添加到blocks数组中
        blocks.Add(b);
    }

    /*这个方法不断地重新创建与删除十分的消耗内存,对于这种大量的重复使用相同对象的操作,我们可以使用更好的办法,如:对象池*/
    public void Select(Block block)
    {
        GetComponent<AudioSource>().Play();     //播放点击音效,只能在有且只有一个Audio时有效,如果有多个音效,则需要加入音效名添加判断才行
        score += block.cantTouch ? -5 : 1;      //判断点击的是否为可触摸的方块儿,如果是不可触摸的,分数减五,否则加一

        MoveDown();
    }

    //使方块向下移动
    private void MoveDown()
    {
        //我们常用的i原意是index “索引”的意思
        for (int i = 0; i < blocks.Count; i++)
        {
            Block b = (Block)blocks[i];


            //下移之后删除物体
            b.MoveDown();
            //删掉移除屏幕的色块
            if (b.rowIndex == -1)
            {
                blocks.RemoveAt(i);
                Destroy(b.gameObject);
                i--;
            }
        }
        //在最上面添加一个方块儿
        AddBlock(3);
    }

    //清理游戏数据
    public void Clean()
    {
        for (int i = 0; i < blocks.Count; i++)
        {
            Block b = (Block)blocks[i];
            blocks.RemoveAt(i);
            Destroy(b.gameObject);
            i--;
        }
    }
}

为了使StartButton能够调用控制器中的两个UI,使用了函数FindObjectOfType(),FindObjectOfType<T>()会返回Type类型第一个激活的加载的物体。
注意:有多个T类对象时,无法使用该函数进行查找,且该函数会遍历场景中所有的物体,运行时会导致工程效率低下,在官网介绍中不推荐使用。

之后给所用到的Button添加好切换场景的功能,
注意:在给图片添加点击事件的时候,只要在代码中创建OnMouseDown()函数,在该函数下进行编辑即可,同时要让图片可以实现被点击的效果,在我们需要实现点击效果的图片上我们要给它加上一个碰撞器(不管是2D还是3D的碰撞器都可以)。
StartButton的按钮代码:
public class StartButton : MonoBehaviour
{
    private GameController gameController;
    void Start()
    {
        gameController = GameObject.FindObjectOfType<GameController>();
    }
    
    void OnMouseDown()
    {
        gameController.EnterGameUI();
    }
}

ReturnButton的按钮代码:
public class ReturnButton : MonoBehaviour
{
    private GameController gameController;
    void Start()
    {
        gameController = GameObject.FindObjectOfType<GameController>();
    }

    void OnMouseDown()
    {
        gameController.ExitStartUI();
    }
}

现在,背景界面的代码与对象就创建好啦,接下来我们将进行游戏场景效果的实现。第一,我们需要添加一个空物体作为方块实例化的父物体,把所有实例化的方块都建在这个空物体下面,并创建Block的类来控制方块的部分功能。
public class Block : MonoBehaviour
{
    public bool cantTouch = false;  //默认所有的方块都是可以触摸的,然后在预设体的白方块儿中勾选这个bool值

    //行列索引
    public int rowIndex;
    public int columnIndex;
    //x,y轴的坐标偏移量
    private float x0ff = -2.25f;
    private float y0ff = -3.68f;
    //游戏控制器
    private GameController gameController;

    void Start()
    {
        gameController = GameObject.FindObjectOfType<GameController>();
    }

    private void OnMouseDown()
    {
        gameController.Select(this);
    }

    public void SetPosition(int columnIndex, int rowIndex)
    {
        this.rowIndex = rowIndex;
        this.columnIndex = columnIndex;
        gameObject.transform.position = new Vector3(x0ff + columnIndex * 1.5f, y0ff + rowIndex * 2.68f, 0);
        
        //gameObject.transform.position = Vector3.Lerp(gameObject.transform.position, new Vector3(x0ff + columnIndex * 1.5f, y0ff + rowIndex * 2.68f, 0), Time.deltaTime);
    }

    //让方块向下移动
    public void MoveDown()
    {
        SetPosition(columnIndex, rowIndex - 1);
    }
}

如果想实现点击不同的方块有不同的音效,那么可以有两种方法来解决:
第一种,在GameController类的Select函数里面去判断,如果点击的方块是什么颜色,就播放什么音效。
第二种就是把不同的音效拖进不同方块的预设体中,然后对Block类进行设置,点击方块,播放它自身携带的音效也能达到效果。

现在,我们的游戏基本功能就都实现了,我们接下来把计分添加进入游戏场景,我们就能开始游戏啦!这里我们使用NGUI来创建游戏中的Button,代码如下:
public class UI : MonoBehaviour {
    //public int x = 40, y = 17, w = 100, h = 50;   //如果无法知晓该在Rect中添加多少值,可以先设置变量,在外面设好位置后把值复制进来并注释掉测试的公有变量
void OnGUI()
    {
        if (GameController.showScore)
        {
            GUIStyle style = new GUIStyle();
            style.normal.textColor = Color.black;
            style.fontSize = 18;
            style.fontStyle = FontStyle.Bold;
            GUI.Label(new Rect(80, 35, 70, 35), "Score:" + GameController.score, style);
        }
    }
}

接下来,我们把游戏打包成安卓应用,点击File->Build Settings,在Platform中选择Android,添加场景,在Player Setting中设置属性,找到Bundle Identifier并把里面的Company改为自己想要修改的名称,Product改为自己游戏的名字,最好都用英文字母来实现,避免打包时出现错误。
再接下来,在Minimum API Level中选择自己安装的API的版本,我这里安装的是API Level 17,其他还有很多参数,但是如果不是很清楚的了解自己需要设置的是哪些,其他的属性都尽量不要随便修改。之后点击Build建立工程。

编译好了之后,在选择编译的目录下面,会有一个Apk安装包,发送到手机上直接安装就可以开始玩了。


由于后期有些修改,但是还没有实现,所以功能部分无法实现,稍稍修改就能实现,当做完剩下功能,将上传正确代码以及游戏的其他功能实现。

更多推荐

制作2D小游戏 “别踩白块儿”

本文发布于:2024-02-12 01:00:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1684787.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:块儿   小游戏   别踩白

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!