柏林噪声算法制作地图+小地图

 以上是效果展示

1,柏林噪声算法做地图代码

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

public class GridMap : MonoBehaviour
{
public Image mapMin;//这里是方便获得小地图从而获得脚本去赋值
public Texture2D texture;//纹理
int w = 128;
int h = 128;

int wnum;//宽分块
int hnum;//高分块

public Vector3 v3;

// Start is called before the first frame update
void Start()
{
int w2 = 128 + 2;
int h2 = 128 + 2;

wnum = texture.width / 128;
hnum = texture.height / 128;

for (int i = 0; i < wnum; i++)
{
for (int j = 0; j < hnum; j++)
{
GameObject game = new GameObject();
game.transform.parent = transform;
//顶点助手
VertexHelper vh = new VertexHelper();
for (int x = 0; x < w2; x++)
{
for (int z = 0; z < h2; z++)
{
//柏林噪算法,传入两个坐标返回一个0到1的值(传入两个相同的值,坐标一定相同)
float y = Mathf.PerlinNoise((i * w + x) * 0.1f, (j * h + z) * 0.1f);
//计算UV坐标
float uvx = (float)(w * i + x) / (texture.width - 1);
float uvy = (float)(h * j + z) / (texture.height - 1);
vh.AddVert(new Vector3(w * i + x - texture.width / 2, y * 5, h * j + z - texture.height / 2), Color.white, new Vector2(uvx, uvy));
if (x < w2 - 1 && z < h2 - 1)
{
vh.AddTriangle(x * h2 + z, x * h2 + z + 1, (x + 1) * h2 + z + 1);
vh.AddTriangle(x * h2 + z, (x + 1) * h2 + z + 1, (x + 1) * h2 + z);
}
}
}

Mesh mesh = new Mesh();
vh.FillMesh(mesh);
game.AddComponent<MeshFilter>().mesh = mesh;
Material material = new Material(Shader.Find("Standard"));//材质
material.mainTexture = texture; //设置纹理
game.AddComponent<MeshRenderer>().material = material;//渲染纹理
game.AddComponent<MeshCollider>().sharedMesh = mesh;//设置网格碰器
}

}
//保存文理的修改
texture.Apply();
Material material1 = new Material(Shader.Find("UI/Default"));
material1.mainTexture = texture;
mapMin.material = material1;//此处是给小地图贴图

}

}

2,小地图代码(放大小地图或者缩小通过鼠标滑轮)

效果图

 //代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class MapsMove : MonoBehaviour, IPointerEnterHandler,IPointerExitHandler
{
public Image map;
public bool sure;//做判断鼠标是否在小地图上面
public void OnPointerEnter(PointerEventData eventData)
{
sure = true;
}

public void OnPointerExit(PointerEventData eventData)
{
sure = false;
}

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
if (sure)
{

if (Input.mouseScrollDelta.y > 0)//滚轮向上滑动
{

map.transform.localScale += Vector3.one;//放大image小地图

}
if (Input.mouseScrollDelta.y < 0)//滚轮向下滑动
{

if (map.transform.localScale.x - 1 > 0)//防止缩小超过最大值导致地图反转
{
map.transform.localScale -= Vector3.one;//缩小image小地图
}


}

}

}
}

 3,通过玩家位置改变锚点和地图中玩家转向(此处代码应该写在小地图中,然后获取玩家脚本得到玩家移动数值,偷懒了QWQ)

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

public class PlayerGod : MonoBehaviour
{
CharacterController character;
Vector3 leftv3;//左下角位置(世界坐标生成的地图左下角的位置)
Vector3 v3;//玩家的当前位置
public Image map;//小地图
public Image player;//玩家在小地图的image

public
// Start is called before the first frame update
void Start()
{
character = GetComponent<CharacterController>();//获取玩家控制器 此处是为了给玩家加重力
leftv3 = new Vector3(-540,0,-540);//地图在世界坐标中左下角位置
}

// Update is called once per frame
void Update()
{
v3 = transform.position;//玩家位置
float x = (v3.x - leftv3.x) / 1025f;//玩家位置的X-世界中地图的左下角位置求得差值x然后比宽的值 求得玩家在地图中的比值从而给锚点赋值
float z = (v3.z - leftv3.z) / 1025f;//同上
map.rectTransform.pivot = new Vector2(x,z);//给锚点重新赋值
map.transform.localPosition = Vector3.zero;//锚点清零使其移动
player.transform.eulerAngles = new Vector3(0,0, -transform.eulerAngles.y);//根据玩家旋转小地图中的玩家也旋转
character.Move(new Vector3(0, -Time.deltaTime * 3, 0));//模拟重力
transform.position += transform.forward * 10 * Time.deltaTime * Input.GetAxis("Vertical");//玩家移动代码 (此处为瞬移)
transform.eulerAngles += transform.up * 130 * Time.deltaTime * Input.GetAxis("Horizontal");//玩家移动代码

}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值