我的Unity3D学习日记-05(官方实例2Droguelike)

快要一个月没有更新了,这段时间也没闲着。今天就把这段时间学到的东西稍微总结一下。

前段时间开始看一些实战开发的内容和教程。一些是来自于麦子学院的视频,一些来自于蛮牛教育,还有一部分官方教学视频。最终选择试着跟着官方的教程,尝试敲一次这个叫做拾荒者的官方示例。

过程中遇到了许多之前不明白的知识,所以虽然代码量不是很大,但是仍然消耗了大量的时间用于查询其中一些使用的方法和技巧。

最终当然是仿照着实例成功地将游戏做了出来(虽然其中大部分东西只要跟着敲都问题不大。)

以下我将一些自己的见解以注释的形式写入了代码中。

首先是一个叫做BoardMannager的脚本,这个脚本用于生成每张地图。由于游戏是设计为一个Roguelike类型的游戏的,那么随机生成的地图一定是必不可少的。

using UnityEngine;
using System; //为了使用其中的Serializable
using System.Collections.Generic;
using Random = UnityEngine.Random;

public class BoardMannager : MonoBehaviour {

    [Serializable]//序列化,<span style="font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 25.2px;"><span style="font-size:10px;">使得变量可以被Inspector界面获得</span></span>
    public class Count //之后用于存储随机生成最小数量和最大数量的值
    {
        public int minimum;
        public int maximum;
        public Count(int min,int max)
        {
            minimum = min;
            maximum = 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;

    private Transform boardHolder;//将所有通过代码生成的对象整合在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;//prefab实例化
                instance.transform.SetParent(boardHolder); //将实例化的对象放到board中
            }
        }
    }

    Vector3 RandomPosition() //随机获取一个地图内的位置
    {
        int randomIndex = Random.Range(0, gridPositions.Count);
        Vector3 randomPosition = gridPositions[randomIndex];
        gridPositions.RemoveAt(randomIndex);
        return randomPosition;
    }


    void LayoutObjectAtRandom(GameObject[] tileArray, int minimum, int maxmum)  //将物品在地图中实例化
    {
        int objectCount = Random.Range(minimum,maxmum+1);

        for (int i = 0; i < objectCount; i++)
        {
            Vector3 randomPosition = RandomPosition();
            GameObject tileChoice = tileArray[Random.Range(0, tileArray.Length)];
            Instantiate(tileChoice,randomPosition,Quaternion.identity);
        }
    }

    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值