Unity中 噪音算法
主要是利用Unity的 Mathf.PerlinNoise 函数(柏林噪声)的不同寻常的功能。
https://docs.unity3d.com/ScriptReference/Mathf.PerlinNoise.html 其中一个实例代码是生成 柏林噪声图片。 第二个实例是动画效果(看似y轴的随机运动,对随机的动画来讲很好啊!)。
这样设置 得到:
1、Mathf.PerlinNoise 函数的返回值是 0~1
2、一样的输入,输出也必将是一样的: 比如下面的测试,输出一直是 0.4652731
void Update()
{
float height = heightScale *Mathf.PerlinNoise(5f/*Time.time * xScale*/, 0.0F);
3、他的代码思路就是 100 *100个方块,然后根据 x, z 设置y坐标值和颜色(跟y有关),
float xSample = (cube.transform.localPosition.x + _seedX) / _relief; float zSample = (cube.transform.localPosition.z + _seedZ) / _relief; float noise = Mathf.PerlinNoise(xSample, zSample); y = _maxHeight * noise; |
为了增加随机性, 对x,z 的系数做随机:
_seedX = Random.value * 100f; _seedZ = Random.value * 100f; |
比如使用噪声生成 类似我的世界的地图等
代码相对简单,直接在Awake 函数中执行生成了 地图!
改变 尺寸 (宽度和深度)
改变 最大高度
如果不启用柏林噪声,而是使用随机的效果:
平整度:
还有是否添加碰撞体:
_relief 跌宕起伏,决定了 采样的间隔大小。值越大跨度越小。
地图大小,就是控制父对象的scale
- // RandomMapMaker.cs
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class RandomMapMaker : MonoBehaviour {
- private float _seedX, _seedZ;
- [SerializeField]
- private float _width = 50;
- [SerializeField]
- private float _depth = 50;
- [SerializeField]
- private bool _needToCollider = false;
- [SerializeField]
- private float _maxHeight = 10;
- [SerializeField]
- private bool _isPerlinNoiseMap = true;
- [SerializeField]
- private float _relief = 15f;
- [SerializeField]
- private bool _isSmoothness = false;
- [SerializeField]
- private float _mapSize = 1f;
- //=================================================================================
- //初期化
- //=================================================================================
- private void Awake () {
- transform.localScale = new Vector3(_mapSize, _mapSize, _mapSize);
- _seedX = Random.value * 100f;
- _seedZ = Random.value * 100f;
- for (int x = 0; x < _width; x++) {
- for (int z = 0; z < _depth; z++) {
- GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
- cube.transform.localPosition = new Vector3 (x, 0, z);
- cube.transform.SetParent (transform);
- if(!_needToCollider){
- Destroy(cube.GetComponent<BoxCollider> ());
- }
- SetY (cube);
- }
- }
- }
- private void OnValidate (){
- if(!Application.isPlaying){
- return;
- }
- transform.localScale = new Vector3(_mapSize, _mapSize, _mapSize);
- foreach (Transform child in transform) {
- SetY (child.gameObject);
- }
- }
- private void SetY(GameObject cube){
- float y = 0;
- if(_isPerlinNoiseMap){
- float xSample = (cube.transform.localPosition.x + _seedX) / _relief;
- float zSample = (cube.transform.localPosition.z + _seedZ) / _relief;
- float noise = Mathf.PerlinNoise(xSample, zSample);
- y = _maxHeight * noise;
- }
- else{
- y = Random.Range (0, _maxHeight);
- }
- if(!_isSmoothness){
- y = Mathf.Round (y);
- }
- cube.transform.localPosition = new Vector3 (cube.transform.localPosition.x, y, cube.transform.localPosition.z);
- Color color = Color.black;
- if(y > _maxHeight * 0.3f){
- ColorUtility.TryParseHtmlString("#019540FF", out color);
- }
- else if(y > _maxHeight * 0.2f){
- ColorUtility.TryParseHtmlString("#2432ADFF", out color);
- }
- else if(y > _maxHeight * 0.1f){
- ColorUtility.TryParseHtmlString("#D4500EFF", out color);
- }
- cube.GetComponent<MeshRenderer> ().material.color = color;
- }
- }
参考:
百度百科: http://baike.baidu.com/item/%E6%9F%8F%E6%9E%97%E5%99%AA%E5%A3%B0
http://postd.cc/understanding-perlin-noise/
http://evilonedeath.blog.fc2.com/blog-entry-127.html
http://befool.co.jp/blog/ayumegu/unity-study-Noise/
http://kan-kikuchi.hatenablog.com/entry/PerlinNoise
Unity中 噪音算法相关推荐
- 【项目记录】过程内容生成(PCG)与快速泊松碟采样算法实现Unity中的物件摆放
背景 在当今游戏开发过程中,创建一个内容丰富的虚拟世界一直是一个十分费时的工作.游戏制作者们希望在更短的时间内在游戏中增加更加多样的内容,过程内容生成技术为有限时间内制作复杂的虚拟世界提供了一种解 ...
- 在Unity中使用四叉树算法绘制地形
四叉树算法在游戏中获得了广泛的应用,前几年3D引擎实现的地形绘制大部分都是用四叉树生成的,因为移动端在硬件方面的限制,我们的地形使用的是美术自己制作的地形,对于程序来说省去了不少工作量,但是作为程序开 ...
- Unity中的AI算法和实现1-Waypoint
本文分享Unity中的AI算法和实现1-Waypoint 在Unity中, 我们有一些有趣且常见的AI算法可以研究和使用, 其中最常见的就是怪物的简单AI, 比如在RPG游戏里, 怪物在某些点定点巡逻 ...
- 本文分享Unity中的AI算法和实现3-有限状态机FSM(下)
本文分享Unity中的AI算法和实现3-有限状态机FSM(下) 回家生孩子, 暂停了一个多月的更新, 今天重新续上, ^_^. 在上一篇文章中, 我们分享了状态机的基本理论, 然后结合Unity的An ...
- Unity中的AI算法和实现2-有限状态机FSM(上)
本文分享Unity中的AI算法和实现2-有限状态机FSM(上) 在上一篇文章中, 我们基于Waypoint构建了一个最简单的AI怪物, 这个怪物可以在几个点之间巡逻. 本篇文章会在此基础之上, 添加怪 ...
- 如何在Unity中实现AStar寻路算法及地图编辑器
文章目录 AStar算法 简介 实现 Node节点 节点间的估价 算法核心 邻节点的搜索方式 地图编辑器 简介 实现 绘制地图网格 障碍/可行走区域 地图数据存储 AStar算法 简介 Unity中提 ...
- 使用新的输入系统在 Unity 中构建第三人称控制器
如果你随机挑选几款游戏,每款游戏可能会有不同的艺术风格和机制.不同的故事,甚至根本没有故事,但它们都有一个共同点:所有游戏都需要读取和处理输入来自键盘.鼠标.游戏手柄.操纵杆.VR 控制器等设备. 构 ...
- 使用示例_在Unity中使用ComputeShader示例
写这篇的缘由是最近老师给了一个UE4的工程,是一个海水模拟的Demo,实现了二十年前一篇paper的算法,paper的地址是: http://citeseerx.ist.psu.edu/viewdoc ...
- 浅析Unity中的Enlighten与混合光照
0x00 前言 在Unity的5.6版本之前的5.x中,主要使用了Geomerics公司的Enlighten[1]来提供实时全局照明以及烘焙全局照明,在5.6之后Unity引入了新的Lightmapp ...
最新文章
- activiti框架 数据库设计说明书
- Linux国内源介绍
- python 解码json数据并在一个OrderdDict中保留其顺序
- LeetCode:Minimum Depth of Binary Tree,Maximum Depth of Binary Tree
- Mac版本Navicat下载
- htmlcss实例小项目_小程序websocket心跳库——websocket-heartbeat-miniprogram
- win7系统图标太大的缩小教程
- 35 【kubernetes】configMap
- 华为云企业主机安全服务之“网页防篡改”:拒绝网页变脸,服务实时在线
- form表单reset报 reset is not a function
- 强化学习读书笔记 - 03 - 有限马尔科夫决策过程
- 实战Nginx与Perl、Java的安装与配置
- Docker安装(有网环境下) 最新版docker-ce安装教程
- [译]关于Android图形系统一些事实真相
- 微信公众号如何变得更好_五个使Windows变得更好的绝对必要的实用程序
- python制作数据增长动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图...
- 什么牌子的护眼灯最好推荐?盘点口碑好的护眼灯品牌
- IDEA 中如何完成Git 和SVN 版本控制的切换
- python爬取晋江_爬虫爬取晋江文学网总分榜(失败)
- 用友数据库服务器如何修改,怎样用友数据库服务器配置
热门文章
- 畅言单点登录php代码,畅言 - 帮助 - wordpress单点登录教程
- 巴比特巴比特 | 元宇宙每日必读:武汉发布促进元宇宙产业创新发展实施方案,武汉的元宇宙要这么干!...
- EC20 4G模块上网配置
- Java使用ffmpeg去除图片水印
- 【苹果相册推送】Apple Album推照片书]发生了什么事?
- The Little Book of Mindfulness by Gilly Pickup
- 只让QQ主界面变成透明皮肤,其他地方都不变
- 点到反比例函数最短距离怎么求_谁教教我反比例函数距离公式?
- lazarus IDE技巧
- ZZULIOJ 1091: 童年生活二三事(多实例测试)详细讲解(c语言)