从零开始入门创作游戏——2D沙盘类地图的材质填充

知道如何生成随机地图后,接下来是如何将材质生成与对应的位置。


  • 材质包的导入

首先需要在菜单栏中的【窗口】——【资源商店】里找到自己喜欢的资源(建议选择免费素材),然后再选择包管理区

打开包管理器后选择对应的素材包,点击右下角的导入,弹出的窗口中选择包内的所需的资源。因为某些包可能包括了用不上的素材,同时避免被人拆包发现其他资源(某些游戏就是被人拆包后发现是盗取别人游戏的素材包)

观察下载的元素大小,如果与unity的格子不一致时,需要调整【每单位像素】,这里要注意:

  1. 一个格子就是一个unity单位长度,默认一个unity格子的像素是100  x 100 
  2. 查看资源图像像素是多少,默认设置的 【每单位像素】的值是多少。

【每单位像素】用人话解释就是,一个unity格子需要包含多少个像素才能将元素图像全部放入。

因此在这里的【每单位像素】填16,即一个unity格子单边包含16像素就能把整个图像放进去。

此外,记得和上一篇文章一样,将图像元素的中心点调整到左下角。

  • 使用草地,泥土,岩石来填充地图格子

首先我们试着使用岩石将填充所有格子。

public class Sandbox_seed : MonoBehaviour
{
    [Header("砖块材质")]    //脚本参数中的标题
    public Sprite stone;    //岩石素材

/* 其他脚本不动 */

    public void GenerateTexture()
    {
        for (int x = 0; x < worldwidth; x++)      //x为地图宽度,因为第一格为0,所以最后一格为199
        {

            float surfaceNoise = Mathf.PerlinNoise((x + seed) * surfaceFreq, seed * surfaceFreq) * surfaceMultiper + groundHeight;
            for (int y = 0; y <= surfaceNoise; y++)
            {
                if (noiseTexture.GetPixel(x, y).r > caveFreq)
                //GetPixel(x, y).r 是指该像素位置的RGB值中的R值,使用b和g都可以
                //如果该像素所在位置的颜色比洞窟参数的颜色深(白)的话,就生成该砖块,否则留空为洞穴
                {
                    GameObject newTile = new GameObject(name = "tile");
                    newTile.transform.parent = this.transform;
                    newTile.AddComponent<SpriteRenderer>();
                    newTile.GetComponent<SpriteRenderer>().sprite = stone;   //生成的元素为石头
                    newTile.transform.position = new Vector2(x, y);
                }

            }
        }
    }
}

在脚本参数中拖动自己的岩石sprite后运行得以下结果

那么接下来增加条件土地高度,即在条件以上的为泥土,以下的为石块

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sandbox_seed : MonoBehaviour
{

/*其他参数不变*/

    [Header("泥土高度")]    //环境变量
    public int dirtHeight = 4;         //地表高度

    public void GenerateTexture()
    {
        for (int x = 0; x < worldwidth; x++)      //x为地图宽度,因为第一格为0,所以最后一格为199
        {

            float surfaceNoise = Mathf.PerlinNoise((x + seed) * surfaceFreq, seed * surfaceFreq) * surfaceMultiper + groundHeight; //生成的是地表高度
            for (int y = 0; y <= surfaceNoise; y++)
            {
                Sprite tileSprite;
                //判断该生成的是什么地貌
                if (y < surfaceNoise - dirtHeight) tileSprite = stone;     //地表高度减去泥土厚度的为岩石
                else if (y <= surfaceNoise - 1) tileSprite = dirt;         //地表高度减1为泥土
                else tileSprite = grass;                                   //剩下的,即地表高度等于1的为泥土

/*其他代码不变*/


            }
        }
    }
}

生成的图像如下

  • 添加随机数来增加地貌变化

首先可以添加随机数来使得土壤层的厚度变化

 生成效果如下

此外素材包中通常包括相类似的几个元素,那么一样可以通过随机数选择其中一个元素进行填充。生成一个类来随机挑选元素中的一个元素,再根据随机出的元素生成砖块。

    public Sprite GetSprite(Sprite[] spriteSet)
    {
        int randomIndex = Random.Range(0, spriteSet.Length);
        print(randomIndex);
        Sprite tileSprite = spriteSet[randomIndex];
        return tileSprite;
    }

地砖判断逻辑改成这样

                if (y < surfaceNoise - dirtNoise) tileSprite = stone;                 //地表高度减去泥土厚度的为岩石
                else if (y <= surfaceNoise - 1) tileSprite = GetSprite(dirtSprites);  //地表高度减1为泥土
                else tileSprite = GetSprite(grassSprites);                            //剩下的,即地表高度等于1的为泥土

最后生成的图像如下,可以看到草地和泥土都是随机的砖块 

猜你喜欢

转载自blog.csdn.net/dwe147/article/details/130382659