Skip to content

Instantly share code, notes, and snippets.

@todorok1
Created January 6, 2021 16:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save todorok1/31b76d19198ecf9c7ebd78eef9e3a9d3 to your computer and use it in GitHub Desktop.
Save todorok1/31b76d19198ecf9c7ebd78eef9e3a9d3 to your computer and use it in GitHub Desktop.
パーリンノイズを重ね合わせてより自然な地形を作ることを目指したサンプル
using UnityEngine;
/// <Summary>
/// パーリンノイズを重ね合わせて
/// より変化に富んだフィールドを生成するクラスです。
/// </Summary>
public class FieldGeneratorMultiPerlin : FieldGenerator
{
// パーリンノイズのオフセットで使用する乱数のシードです。
public int seed = 0;
// パーリンノイズを重ね合わせる回数を設定します。
public int addTimes = 3;
// パーリンノイズを重ね合わせる回数を設定します。
public int multipleTimes = 2;
// 足し合わせるか、乗算するかのフラグです。
bool isAddMode;
/// <Summary>
/// 生成(加算変化)ボタンが押された時のメソッドです。
/// </Summary>
public void OnPressedAddPerlinButton()
{
isAddMode = true;
GenerateMultiPerlinFieldParts();
}
/// <Summary>
/// 生成(乗算変化)ボタンが押された時のメソッドです。
/// </Summary>
public void OnPressedMultiplePerlinButton()
{
isAddMode = false;
GenerateMultiPerlinFieldParts();
}
/// <Summary>
/// フィールドを生成するメソッドです。
/// </Summary>
void GenerateMultiPerlinFieldParts()
{
for (float z = 0f; z < fieldSizeZ; z++)
{
for (float x = 0f; x < fieldSizeX; x++)
{
// パーリンノイズの座標を指定して値を取得します。
float xValue = (xOrigin + x) * scale;
float yValue = (yOrigin + z) * scale;
float perlinValue = isAddMode ? GetAddedPerlinNoise(xValue, yValue) : GetMultiplePerlinNoise(xValue, yValue);
float height = fieldHeight * perlinValue;
// 位置のVector3を作成してオブジェクトをインスタンス化します。
Vector3 pos = new Vector3(x, height, z);
InstantiateFieldParts(pos);
}
}
}
/// <Summary>
/// 複数のパーリンノイズを重ね合わせるメソッドです。
/// </Summary>
float GetAddedPerlinNoise(float xPos, float yPos)
{
// 重ね合わせの回数が0の場合はそのまま0を返します。
if (addTimes == 0)
{
return 0f;
}
// 乱数のシードを設定します。
Random.InitState(seed);
// パーリンノイズの値を指定回数だけ加算します。
float perlinValue = 0f;
for (int i = 0; i < addTimes; i++)
{
float offsetValue = Random.value;
float xOffset = offsetValue * fieldSizeX;
float yOffset = offsetValue * fieldSizeZ;
float scaleOffset = Random.Range(0.8f, 1.25f);
float xValue = (xPos + xOffset) * scaleOffset;
float yValue = (yPos + yOffset) * scaleOffset;
perlinValue += Mathf.PerlinNoise(xValue, yValue);
}
// 重ね合わせた回数で平均を取ります。
perlinValue = perlinValue / addTimes;
return perlinValue;
}
/// <Summary>
/// 複数のパーリンノイズをかけ合わせるメソッドです。
/// </Summary>
float GetMultiplePerlinNoise(float xPos, float yPos)
{
// 乱数のシードを設定します。
Random.InitState(seed);
// パーリンノイズの値を指定回数だけ乗算します。
float perlinValue = Mathf.PerlinNoise(xPos, yPos);
for (int i = 0; i < multipleTimes; i++)
{
float offsetValue = Random.value;
float xOffset = offsetValue * fieldSizeX;
float yOffset = offsetValue * fieldSizeZ;
float scaleOffset = Random.Range(0.8f, 1.25f);
float xValue = (xPos + xOffset) * scaleOffset;
float yValue = (yPos + yOffset) * scaleOffset;
float value = Mathf.PerlinNoise(xValue, yValue);
perlinValue *= Mathf.Clamp01(value);
}
return perlinValue;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment