質問編集履歴

3 追記

t2t21212

t2t21212 score 62

2019/04/16 01:00  投稿

Unity2D テクスチャブレンド
### 前提・実現したいこと
メッシュにシェーダーを適応させて、自然な見た目の地形表現をしたい。
### 該当のソースコード
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class World : MonoBehaviour
{
   public int width;
   public int height;
   public Tile[,] tiles;
   public Material material;
   Mesh mesh;
   public string seed;
   public bool randomSeed;
   public float frequency;
   public float amplitude;
   public float lacunarity;
   public float persistance;
   public int octaves;
   Noise noise;
   public float seaLevel;
   public float beachStartHeight;
   public float beachEndHeight;
   public float grassStartHeight;
   public float grassEndHeight;
   public float dirtStartHeight;
   public float dirtEndHeight;
   public float stoneStartHeight;
   public float stoneEndHeight;
   private void Awake()
   {
       if(randomSeed == true)
       {
           int value = Random.Range(-1000, 10000);
           seed = value.ToString();
       }
       noise = new Noise(seed.GetHashCode(), frequency, amplitude, lacunarity, persistance, octaves);
   }
   // Use this for initialization
   void Start()
   {
       CreateTiles();
       GenerateMesh();
   }
   // Update is called once per frame
   void Update()
   {
       Graphics.DrawMesh(mesh, Vector3.zero, Quaternion.identity, material, 0);
   }
   void CreateTiles()
   {
       this.tiles = new Tile[this.width, this.height];
       float[,] noiseValues = this.noise.GetNoiseValues(this.width + 1, this.height + 1);
       for (int i = 0; i < this.width; i++)
       {
           for (int j = 0; j < this.height; j++)
           {
               Vector4 weights = new Vector4(noiseValues[i, j], noiseValues[i + 1, j], noiseValues[i, j + 1], noiseValues[i + 1, j + 1]);
               float currentHeight = noiseValues[i, j];
               if(currentHeight < seaLevel)
               {
                   Tile.Type type = Tile.Type.Water;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Sand, Tile.Type.Water, weights);
               }
               else if (currentHeight >= beachStartHeight && currentHeight <= beachEndHeight)
               {
                   Tile.Type type = Tile.Type.Sand;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= grassStartHeight && currentHeight <= grassEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= dirtStartHeight && currentHeight <= dirtEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= stoneStartHeight && currentHeight <= stoneEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Grass, weights);
               }
               else
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
           }
       }
   }
   void GenerateMesh()
   {
       MeshData data = new MeshData(this.tiles);
       this.mesh = new Mesh();
       this.mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
       this.mesh.vertices = data.vertices.ToArray();
       this.mesh.triangles = data.triangles.ToArray();
       this.mesh.SetUVs(0, data.UVs);
       this.mesh.colors = data.colors.ToArray();
       this.mesh.RecalculateNormals();
       this.mesh.RecalculateBounds();
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class MeshData{
   public List<Vector3> vertices;
   public List<int> triangles;
   public List<Vector4> UVs;
   public List<Color> colors;
   public MeshData(Tile[,] data)
   {
       vertices = new List<Vector3>();
       triangles = new List<int>();
       UVs = new List<Vector4>();
       colors = new List<Color>();
       for (int i = 0; i < data.GetLength(0); i++)
       {
           for (int j = 0; j < data.GetLength(1); j++)
           {
               CreateSquare(data[i, j], i, j);
           }
       }
   }
   void CreateSquare(Tile tile, int x, int y)
   {
       vertices.Add(new Vector3(x + 0, y + 0));
       vertices.Add(new Vector3(x + 1, y + 0));
       vertices.Add(new Vector3(x + 0, y + 1));
       vertices.Add(new Vector3(x + 1, y + 1));
       triangles.Add(vertices.Count - 1);
       triangles.Add(vertices.Count - 3);
       triangles.Add(vertices.Count - 4);
       triangles.Add(vertices.Count - 2);
       triangles.Add(vertices.Count - 1);
       triangles.Add(vertices.Count - 4);
       Vector2[] foregroundUVs = SpriteLoader.instance.GetTileUVs(tile.foregroundType);
       Vector2[] backgroundUVs = SpriteLoader.instance.GetTileUVs(tile.backgroundType);
       UVs.AddRange(foregroundUVs.Zip(backgroundUVs, (f, b) => new Vector4(f.x, f.y, b.x, b.y)));
       for (int i = 0; i < 4; i++)
       {
           colors.Add(new Color(0.0f, 0.0f, 0.0f, tile.blendWeights[i]));
       }
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tile
{
   public enum Type { Dirt, Grass,Water,Sand,Void }
   public Type type;
   public Type foregroundType;
   public Type backgroundType;
   public Vector4 blendWeights;
   public Tile(Type type, Type foreground, Type background, Vector4 weights)
   {
       this.type = type;
       this.foregroundType = foreground;
       this.backgroundType = background;
       this.blendWeights = weights;
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Noise {
   int seed;
   float frequency;
   float amplitude;
   float lacunarity;
   float persistance;
   int octaves;
   public Noise(int seed,float frequency,float amplitude,float lacunarity,float persistance,int octaves)
   {
       this.seed = seed;
       this.frequency = frequency;
       this.amplitude = amplitude;
       this.lacunarity = lacunarity;
       this.persistance = persistance;
       this.octaves = octaves;
   }
   public float [,] GetNoiseValues(int width,int height)
   {
       float[,] noiseValues = new float[width, height];
       float max = 0f;
       float min = float.MaxValue;
       seed %= 1024;
       for (int i = 0; i < width; i++)
       {
           for(int j =0; j < height; j++)
           {
               noiseValues[i, j] = 0f;
               float tempA = amplitude;
               float tempF = frequency;
               for(int k = 0;k < octaves; k++)
               {
                   noiseValues[i, j] += Mathf.PerlinNoise((i + seed) / (float)width * frequency, j / (float)height * frequency) * amplitude;
                   frequency *= lacunarity;
                   amplitude *= persistance;
               }
               amplitude = tempA;
               frequency = tempF;
               if(noiseValues[i,j] > max)
               {
                   max = noiseValues[i, j];
               }
               if(noiseValues[i,j] < min)
               {
                   min = noiseValues[i, j];
               }
           }
       }
       for (int i = 0; i < width; i++)
       {
           for (int j = 0; j < height; j++)
           {
               noiseValues[i, j] = Mathf.InverseLerp(max, min, noiseValues[i, j]);
           }
       }
       return noiseValues;
   }
}
```
### 試したこと
前回アドバイスしていただいたコードを改造して、描画するタイルを増やしたのですが、綺麗な地形表現にはなりませんでした。改造しなければ上手くいきます。
前回アドバイスしていただいたコードを改造して、描画するタイルを増やしたのですが、綺麗な地形表現にはなりませんでした。前回の質問のコードを使い、二枚のタイルだけなら、上手くいきます。
![イメージ説明](5371699c4c156126aa5ec6ee0698b424.png)
![イメージ説明](4bd99a6071502169775a9a9069c37674.png)
前景と背景のグラフィックを混ぜ合わせて描画しているのですが、四角形のメッシュで生成しているので、隣合うグラフィックの問題で、地形のように見えなくなっているのだと自分は考えました。
具体的にはBeach Start HeightとBeach End Heidhtという変数を使い、浜辺のように見せようとしているのですが、四角形に描画されるため、浜辺には見えなくなっています。
増やした変数の値は以下です。
![イメージ説明](37e9e8cb04850c858f1d2e966ea1e842.png)
使用したタイル↓
![イメージ説明](f6771e8c53e489624cc71c3df77b718b.png)
文字数制限に引っ掛かるため、「SpriteLoader」というスクリプトは記載しませんでした。前回の質問に記載してあります。
どのようにすればいいでしょうか? 回答お願いします。
  • C#

    12249 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    8275 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    2004 questions

2 画像の追加

t2t21212

t2t21212 score 62

2019/04/16 00:51  投稿

Unity2D テクスチャブレンド
### 前提・実現したいこと
メッシュにシェーダーを適応させて、自然な見た目の地形表現をしたい。
### 該当のソースコード
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class World : MonoBehaviour
{
   public int width;
   public int height;
   public Tile[,] tiles;
   public Material material;
   Mesh mesh;
   public string seed;
   public bool randomSeed;
   public float frequency;
   public float amplitude;
   public float lacunarity;
   public float persistance;
   public int octaves;
   Noise noise;
   public float seaLevel;
   public float beachStartHeight;
   public float beachEndHeight;
   public float grassStartHeight;
   public float grassEndHeight;
   public float dirtStartHeight;
   public float dirtEndHeight;
   public float stoneStartHeight;
   public float stoneEndHeight;
   private void Awake()
   {
       if(randomSeed == true)
       {
           int value = Random.Range(-1000, 10000);
           seed = value.ToString();
       }
       noise = new Noise(seed.GetHashCode(), frequency, amplitude, lacunarity, persistance, octaves);
   }
   // Use this for initialization
   void Start()
   {
       CreateTiles();
       GenerateMesh();
   }
   // Update is called once per frame
   void Update()
   {
       Graphics.DrawMesh(mesh, Vector3.zero, Quaternion.identity, material, 0);
   }
   void CreateTiles()
   {
       this.tiles = new Tile[this.width, this.height];
       float[,] noiseValues = this.noise.GetNoiseValues(this.width + 1, this.height + 1);
       for (int i = 0; i < this.width; i++)
       {
           for (int j = 0; j < this.height; j++)
           {
               Vector4 weights = new Vector4(noiseValues[i, j], noiseValues[i + 1, j], noiseValues[i, j + 1], noiseValues[i + 1, j + 1]);
               float currentHeight = noiseValues[i, j];
               if(currentHeight < seaLevel)
               {
                   Tile.Type type = Tile.Type.Water;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Sand, Tile.Type.Water, weights);
               }
               else if (currentHeight >= beachStartHeight && currentHeight <= beachEndHeight)
               {
                   Tile.Type type = Tile.Type.Sand;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= grassStartHeight && currentHeight <= grassEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= dirtStartHeight && currentHeight <= dirtEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= stoneStartHeight && currentHeight <= stoneEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Grass, weights);
               }
               else
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
           }
       }
   }
   void GenerateMesh()
   {
       MeshData data = new MeshData(this.tiles);
       this.mesh = new Mesh();
       this.mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
       this.mesh.vertices = data.vertices.ToArray();
       this.mesh.triangles = data.triangles.ToArray();
       this.mesh.SetUVs(0, data.UVs);
       this.mesh.colors = data.colors.ToArray();
       this.mesh.RecalculateNormals();
       this.mesh.RecalculateBounds();
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class MeshData{
   public List<Vector3> vertices;
   public List<int> triangles;
   public List<Vector4> UVs;
   public List<Color> colors;
   public MeshData(Tile[,] data)
   {
       vertices = new List<Vector3>();
       triangles = new List<int>();
       UVs = new List<Vector4>();
       colors = new List<Color>();
       for (int i = 0; i < data.GetLength(0); i++)
       {
           for (int j = 0; j < data.GetLength(1); j++)
           {
               CreateSquare(data[i, j], i, j);
           }
       }
   }
   void CreateSquare(Tile tile, int x, int y)
   {
       vertices.Add(new Vector3(x + 0, y + 0));
       vertices.Add(new Vector3(x + 1, y + 0));
       vertices.Add(new Vector3(x + 0, y + 1));
       vertices.Add(new Vector3(x + 1, y + 1));
       triangles.Add(vertices.Count - 1);
       triangles.Add(vertices.Count - 3);
       triangles.Add(vertices.Count - 4);
       triangles.Add(vertices.Count - 2);
       triangles.Add(vertices.Count - 1);
       triangles.Add(vertices.Count - 4);
       Vector2[] foregroundUVs = SpriteLoader.instance.GetTileUVs(tile.foregroundType);
       Vector2[] backgroundUVs = SpriteLoader.instance.GetTileUVs(tile.backgroundType);
       UVs.AddRange(foregroundUVs.Zip(backgroundUVs, (f, b) => new Vector4(f.x, f.y, b.x, b.y)));
       for (int i = 0; i < 4; i++)
       {
           colors.Add(new Color(0.0f, 0.0f, 0.0f, tile.blendWeights[i]));
       }
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tile
{
   public enum Type { Dirt, Grass,Water,Sand,Void }
   public Type type;
   public Type foregroundType;
   public Type backgroundType;
   public Vector4 blendWeights;
   public Tile(Type type, Type foreground, Type background, Vector4 weights)
   {
       this.type = type;
       this.foregroundType = foreground;
       this.backgroundType = background;
       this.blendWeights = weights;
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Noise {
   int seed;
   float frequency;
   float amplitude;
   float lacunarity;
   float persistance;
   int octaves;
   public Noise(int seed,float frequency,float amplitude,float lacunarity,float persistance,int octaves)
   {
       this.seed = seed;
       this.frequency = frequency;
       this.amplitude = amplitude;
       this.lacunarity = lacunarity;
       this.persistance = persistance;
       this.octaves = octaves;
   }
   public float [,] GetNoiseValues(int width,int height)
   {
       float[,] noiseValues = new float[width, height];
       float max = 0f;
       float min = float.MaxValue;
       seed %= 1024;
       for (int i = 0; i < width; i++)
       {
           for(int j =0; j < height; j++)
           {
               noiseValues[i, j] = 0f;
               float tempA = amplitude;
               float tempF = frequency;
               for(int k = 0;k < octaves; k++)
               {
                   noiseValues[i, j] += Mathf.PerlinNoise((i + seed) / (float)width * frequency, j / (float)height * frequency) * amplitude;
                   frequency *= lacunarity;
                   amplitude *= persistance;
               }
               amplitude = tempA;
               frequency = tempF;
               if(noiseValues[i,j] > max)
               {
                   max = noiseValues[i, j];
               }
               if(noiseValues[i,j] < min)
               {
                   min = noiseValues[i, j];
               }
           }
       }
       for (int i = 0; i < width; i++)
       {
           for (int j = 0; j < height; j++)
           {
               noiseValues[i, j] = Mathf.InverseLerp(max, min, noiseValues[i, j]);
           }
       }
       return noiseValues;
   }
}
```
### 試したこと
前回アドバイスしていただいたコードを改造して、描画するタイルを増やしたのですが、綺麗な地形表現にはなりませんでした。改造しなければ上手くいきます。
![イメージ説明](5371699c4c156126aa5ec6ee0698b424.png)
![イメージ説明](4bd99a6071502169775a9a9069c37674.png)
前景と背景のグラフィックを混ぜ合わせて描画しているのですが、四角形のメッシュで生成しているので、隣合うグラフィックの問題で、地形のように見えなくなっているのだと自分は考えました。
具体的にはBeach Start HeightとBeach End Heidhtという変数を使い、浜辺のように見せようとしているのですが、四角形に描画されるため、浜辺には見えなくなっています。
増やした変数の値は以下です。
![イメージ説明](37e9e8cb04850c858f1d2e966ea1e842.png)
使用したタイル↓  
![イメージ説明](f6771e8c53e489624cc71c3df77b718b.png)  
文字数制限に引っ掛かるため、「SpriteLoader」というスクリプトは記載しませんでした。前回の質問に記載してあります。
どのようにすればいいでしょうか? 回答お願いします。
  • C#

    12249 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    8275 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    2004 questions

1 画像の追加

t2t21212

t2t21212 score 62

2019/04/16 00:48  投稿

Unity2D テクスチャブレンド
### 前提・実現したいこと
メッシュにシェーダーを適応させて、自然な見た目の地形表現をしたい。
### 該当のソースコード
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class World : MonoBehaviour
{
   public int width;
   public int height;
   public Tile[,] tiles;
   public Material material;
   Mesh mesh;
   public string seed;
   public bool randomSeed;
   public float frequency;
   public float amplitude;
   public float lacunarity;
   public float persistance;
   public int octaves;
   Noise noise;
   public float seaLevel;
   public float beachStartHeight;
   public float beachEndHeight;
   public float grassStartHeight;
   public float grassEndHeight;
   public float dirtStartHeight;
   public float dirtEndHeight;
   public float stoneStartHeight;
   public float stoneEndHeight;
   private void Awake()
   {
       if(randomSeed == true)
       {
           int value = Random.Range(-1000, 10000);
           seed = value.ToString();
       }
       noise = new Noise(seed.GetHashCode(), frequency, amplitude, lacunarity, persistance, octaves);
   }
   // Use this for initialization
   void Start()
   {
       CreateTiles();
       GenerateMesh();
   }
   // Update is called once per frame
   void Update()
   {
       Graphics.DrawMesh(mesh, Vector3.zero, Quaternion.identity, material, 0);
   }
   void CreateTiles()
   {
       this.tiles = new Tile[this.width, this.height];
       float[,] noiseValues = this.noise.GetNoiseValues(this.width + 1, this.height + 1);
       for (int i = 0; i < this.width; i++)
       {
           for (int j = 0; j < this.height; j++)
           {
               Vector4 weights = new Vector4(noiseValues[i, j], noiseValues[i + 1, j], noiseValues[i, j + 1], noiseValues[i + 1, j + 1]);
               float currentHeight = noiseValues[i, j];
               if(currentHeight < seaLevel)
               {
                   Tile.Type type = Tile.Type.Water;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Sand, Tile.Type.Water, weights);
               }
               else if (currentHeight >= beachStartHeight && currentHeight <= beachEndHeight)
               {
                   Tile.Type type = Tile.Type.Sand;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= grassStartHeight && currentHeight <= grassEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= dirtStartHeight && currentHeight <= dirtEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
               else if(currentHeight >= stoneStartHeight && currentHeight <= stoneEndHeight)
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Grass, weights);
               }
               else
               {
                   Tile.Type type = Tile.Type.Grass;
                   this.tiles[i, j] = new Tile(type, Tile.Type.Grass, Tile.Type.Sand, weights);
               }
           }
       }
   }
   void GenerateMesh()
   {
       MeshData data = new MeshData(this.tiles);
       this.mesh = new Mesh();
       this.mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
       this.mesh.vertices = data.vertices.ToArray();
       this.mesh.triangles = data.triangles.ToArray();
       this.mesh.SetUVs(0, data.UVs);
       this.mesh.colors = data.colors.ToArray();
       this.mesh.RecalculateNormals();
       this.mesh.RecalculateBounds();
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class MeshData{
   public List<Vector3> vertices;
   public List<int> triangles;
   public List<Vector4> UVs;
   public List<Color> colors;
   public MeshData(Tile[,] data)
   {
       vertices = new List<Vector3>();
       triangles = new List<int>();
       UVs = new List<Vector4>();
       colors = new List<Color>();
       for (int i = 0; i < data.GetLength(0); i++)
       {
           for (int j = 0; j < data.GetLength(1); j++)
           {
               CreateSquare(data[i, j], i, j);
           }
       }
   }
   void CreateSquare(Tile tile, int x, int y)
   {
       vertices.Add(new Vector3(x + 0, y + 0));
       vertices.Add(new Vector3(x + 1, y + 0));
       vertices.Add(new Vector3(x + 0, y + 1));
       vertices.Add(new Vector3(x + 1, y + 1));
       triangles.Add(vertices.Count - 1);
       triangles.Add(vertices.Count - 3);
       triangles.Add(vertices.Count - 4);
       triangles.Add(vertices.Count - 2);
       triangles.Add(vertices.Count - 1);
       triangles.Add(vertices.Count - 4);
       Vector2[] foregroundUVs = SpriteLoader.instance.GetTileUVs(tile.foregroundType);
       Vector2[] backgroundUVs = SpriteLoader.instance.GetTileUVs(tile.backgroundType);
       UVs.AddRange(foregroundUVs.Zip(backgroundUVs, (f, b) => new Vector4(f.x, f.y, b.x, b.y)));
       for (int i = 0; i < 4; i++)
       {
           colors.Add(new Color(0.0f, 0.0f, 0.0f, tile.blendWeights[i]));
       }
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tile
{
   public enum Type { Dirt, Grass,Water,Sand,Void }
   public Type type;
   public Type foregroundType;
   public Type backgroundType;
   public Vector4 blendWeights;
   public Tile(Type type, Type foreground, Type background, Vector4 weights)
   {
       this.type = type;
       this.foregroundType = foreground;
       this.backgroundType = background;
       this.blendWeights = weights;
   }
}
```
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Noise {
   int seed;
   float frequency;
   float amplitude;
   float lacunarity;
   float persistance;
   int octaves;
   public Noise(int seed,float frequency,float amplitude,float lacunarity,float persistance,int octaves)
   {
       this.seed = seed;
       this.frequency = frequency;
       this.amplitude = amplitude;
       this.lacunarity = lacunarity;
       this.persistance = persistance;
       this.octaves = octaves;
   }
   public float [,] GetNoiseValues(int width,int height)
   {
       float[,] noiseValues = new float[width, height];
       float max = 0f;
       float min = float.MaxValue;
       seed %= 1024;
       for (int i = 0; i < width; i++)
       {
           for(int j =0; j < height; j++)
           {
               noiseValues[i, j] = 0f;
               float tempA = amplitude;
               float tempF = frequency;
               for(int k = 0;k < octaves; k++)
               {
                   noiseValues[i, j] += Mathf.PerlinNoise((i + seed) / (float)width * frequency, j / (float)height * frequency) * amplitude;
                   frequency *= lacunarity;
                   amplitude *= persistance;
               }
               amplitude = tempA;
               frequency = tempF;
               if(noiseValues[i,j] > max)
               {
                   max = noiseValues[i, j];
               }
               if(noiseValues[i,j] < min)
               {
                   min = noiseValues[i, j];
               }
           }
       }
       for (int i = 0; i < width; i++)
       {
           for (int j = 0; j < height; j++)
           {
               noiseValues[i, j] = Mathf.InverseLerp(max, min, noiseValues[i, j]);
           }
       }
       return noiseValues;
   }
}
```
### 試したこと
前回アドバイスしていただいたコードを改造して、描画するタイルを増やしたのですが、綺麗な地形表現にはなりませんでした。
前回アドバイスしていただいたコードを改造して、描画するタイルを増やしたのですが、綺麗な地形表現にはなりませんでした。改造しなければ上手くいきます。
![イメージ説明](5371699c4c156126aa5ec6ee0698b424.png)
![イメージ説明](4bd99a6071502169775a9a9069c37674.png)  
前景と背景のグラフィックを混ぜ合わせて描画しているのですが、四角形のメッシュで生成しているので、隣合うグラフィックの問題で、地形のように見えなくなっているのだと自分は考えました。
具体的にはBeach Start HeightとBeach End Heidhtという変数を使い、浜辺のように見せようとしているのですが、四角形に描画されるため、浜辺には見えなくなっています。
増やした変数の値は以下です。
![イメージ説明](37e9e8cb04850c858f1d2e966ea1e842.png)
文字数制限に引っ掛かるため、「SpriteLoader」というスクリプトは記載しませんでした。前回の質問に記載してあります。
どのようにすればいいでしょうか? 回答お願いします。
  • C#

    12249 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    8275 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    2004 questions

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る