知道如何生成随机地图后,接下来是如何将材质生成与对应的位置。
-
材质包的导入
首先需要在菜单栏中的【窗口】——【资源商店】里找到自己喜欢的资源(建议选择免费素材),然后再选择包管理区
打开包管理器后选择对应的素材包,点击右下角的导入,弹出的窗口中选择包内的所需的资源。因为某些包可能包括了用不上的素材,同时避免被人拆包发现其他资源(某些游戏就是被人拆包后发现是盗取别人游戏的素材包)
观察下载的元素大小,如果与unity的格子不一致时,需要调整【每单位像素】,这里要注意:
- 一个格子就是一个unity单位长度,默认一个unity格子的像素是100 x 100
- 查看资源图像像素是多少,默认设置的 【每单位像素】的值是多少。
【每单位像素】用人话解释就是,一个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的为泥土
最后生成的图像如下,可以看到草地和泥土都是随机的砖块