Unity3D 2D游戏开发 官方教程。(五)

本文详细介绍了如何在游戏开发中创建关卡管理器脚本,包括场景尺寸、内墙、食物、出口等元素的配置与初始化。通过使用C#编程语言,实现关卡布局和物品随机放置,提升游戏的可玩性和趣味性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

五关卡管理器
切换Project/Asserts/Scripts窗口下,创建脚本文件BoardManager.cs(本文以C#为开发语言)
5.1创建脚本
首先选择Scripts文件夹,右侧窗口为文件夹内容窗口,默认为空白。鼠标右键Create/C# Script即可。如图:
这里写图片描述
选择任何一个脚本文件,双击,系统弹出脚本编辑窗口。如图:
这里写图片描述
5.2关卡脚本
首先编辑BoardManager代码如下:

using UnityEngine;
using System.Collections.Generic;
using System;
using Random = UnityEngine.Random;
public class BoardManager : MonoBehaviour {

    [Serializable]
    public class Count
    {
        public int minimum;
        public int maxmum;
        public Count(int min,int max)
        {
            minimum = min;
            maxmum = max;
        }
    }
    //场景尺寸
    public int columns = 8;
    public int rows = 8;
    //内墙数量
    public Count wallCount = new Count(5,9);
    //食物数量
    public Count foodCount = new Count(1,5);
    //出口
    public GameObject exit;
    //地板精灵
    public GameObject[] floorTiles;
    //内墙精灵
    public GameObject[] wallTiles;
    //食物精灵
    public GameObject[] foodTiles;
    //敌人精灵
    public GameObject[] enemyTiles;
    //外墙精灵
    public GameObject[] outerWallTiles;
    //Hierarchy中产生的对象,都放进来,让项目更整洁。
    private Transform boardHolder;
    //跟踪地图中的所有位置
    private List<Vector3> gridPositions = new List<Vector3>();
    //初始化位置信息
    void InitialiseList()
    {
        //清除上衣关卡的对象
        gridPositions.Clear();
        //构造位置信息
        for(int x=1;x<columns -1 ;x++)
        {
            for(int y=1;y<rows -1 ;y++)
            {
                gridPositions.Add(new Vector3(x,y,0f));
            }
        }
    }
    //初始化墙信息
    void BoardSetup()
    {
        boardHolder = new GameObject("Board").transform;
        for(int x=-1;x<columns +1 ;x++)
        {
            for(int y=-1;y<rows +1 ;y++)
            {
                //创建地板
                GameObject toInstantiate = floorTiles[Random.Range(0,floorTiles.Length)];
                if(x==-1 || x==columns || y ==-1 ||y==rows)
                {
                    //创建外墙
                    toInstantiate = outerWallTiles[Random.Range(0,outerWallTiles.Length)];
                }
                GameObject instance = Instantiate(toInstantiate,new Vector3(x,y,0f),Quaternion.identity) as GameObject;
                //放入board中
                instance.transform.SetParent(boardHolder);
            }
        }
    }
    //场景中活动区域,随机选取一个位置
    Vector3 RandomPosition()
    {
        int randomIndex = Random.Range(0,gridPositions.Count);
        Vector3 randomPosition = gridPositions[randomIndex];
        gridPositions.RemoveAt(randomIndex);
        return randomPosition;
    }
    //设置物品
    void LayoutObjectAtRandom(GameObject[] tileAttay,int minimum,int maxmum)
    {
        //随机物品数量
        int objectCount = Random.Range(minimum,maxmum+1);
        for(int i=0;i<objectCount;i++)
        {
            //一个随机位置
            Vector3 randomPosition = RandomPosition();
            //产生一个物品的随机精灵
            int tmp = Random.Range(0,tileAttay.Length);
            GameObject tileChoice = tileAttay[tmp];
            //添加到场景
            Instantiate(tileChoice,randomPosition,Quaternion.identity);
        }
    }
    //创建场景
    public void SetupScene(int level)
    {
        BoardSetup();
        InitialiseList();
        //创建内墙
        LayoutObjectAtRandom(wallTiles , wallCount.minimum, wallCount.maxmum);
        //创建食物
        LayoutObjectAtRandom(foodTiles , foodCount.minimum, foodCount.maxmum);
        //创建敌人
        int enemyCount = (int)Mathf.Log(level,2f);
        LayoutObjectAtRandom(enemyTiles , enemyCount, enemyCount);
        //创建出口
        Instantiate(exit , new Vector3(columns-1,rows-1,0f),Quaternion.identity);
    }
}

场景坐标系如图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值