首页 > 编程语言 >柏林噪声算法制作地图+小地图

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

时间:2023-03-03 14:01:25浏览次数:43  
标签:地图 噪声 transform 玩家 算法 new using public

 

 以上是效果展示

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");//玩家移动代码

 

}
}

标签:地图,噪声,transform,玩家,算法,new,using,public
From: https://www.cnblogs.com/qinhuanghan5/p/17175329.html

相关文章

  • 记录用C#写折半查找算法实现
    折半查找算法前言最近要考试了,重新回顾一下之前学的算法,今天是折半查找,它的平均比较次数是Log2n思想给定一个有序数组A[0..n-1],和查找值K,返回K在A中的下标。折半查......
  • 香港科技大学& 阿里巴巴提出神经隐式地图表示的稠密RGB SLAM
    以下内容来自小六的机器人SLAM学习圈知识星球每日更新内容点击领取学习资料→机器人SLAM学习资料大礼包论文##开源代码#DenseRGBSLAMwithNeuralImplicitMaps论......
  • 差分约束算法
    \[\begin{cases}x_{c_1}-x_{c'_1}\leqy_1\\x_{c_2}-x_{c'_2}\leqy_2\\\cdots\\x_{c_m}-x_{c'_m}\leqy_m\end{cases}\]转化为最短距离:对于任意的一个不等式\(x......
  • m基于DCAR编码感知的网络路由发现算法matlab仿真
    1.算法描述1.路由请求过程        当一个源节点有数据要向目的节点发送且在当前路由缓存中未发现可用路径时,则启动路由请求过程,下面分步对该过程进行说明: 步......
  • 【算法设计-模拟】进制转换
    目录1.十进制转二进制2.十进制转r进制(2<=r<=37)3.将M进制数X转换为N进制数(2<=M,N<=37)1.十进制转二进制#include<stdio.h>#include<vector>usingnamespacestd;......
  • 负载均衡算法
    负载均衡算法负载均衡器的实现可以分为两个部分:根据负载均衡算法在候选服务器列表选出一个服务器;将请求数据发送到该服务器上。负载均衡算法是负载均衡服务核心中的......
  • 算法随想Day27【回溯算法】| LC332-重新安排行程、LC51-N皇后、LC37-解数独
    LC332.重新安排行程做了很久,还是没有通过全部案例,最后是一个输入为100个元素的数组,运行超出时间限制。LC51.N皇后实现了回溯算法中的超暴力解法,主要是对某个节点的斜......
  • 两数之和 II - 输入有序数组(数据结构和算法两种实现方式)
    题目:给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[ind......
  • Lin-Canny算法
    求解凸包间的最近点对是计算几何中一个非常有用的算法,经常被用在诸如碰撞检测、物理引擎等图形学相关的领域,而且该算法的效率对于最终整个系统的效能有着相当关键的制约。......
  • 每日算法--2023.3.2
    1.剑指offer46--把数字翻译成字符串classSolution{publicinttranslateNum(intnum){List<Integer>container=newLinkedList<>();while(......