質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

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

Unity

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

解決済

Unity2D 描画がちらつく

削除済ユーザー
削除済ユーザー

総合スコア0

C#

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

Unity

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

2回答

0評価

0クリップ

2997閲覧

投稿2019/07/01 16:59

編集2022/01/12 10:58

前提・実現したいこと

メッシュ描画のちらつきを直したい

該当のソースコード

C#

using System.Collections; using System.Collections.Generic; using UnityEngine; namespace TinyWorld { public class MeshData { public List<Vector3> vertices; public List<int> triangles; public List<Vector2> UVs; public MeshData(Tile[,] data) { vertices = new List<Vector3>(); triangles = new List<int>(); UVs = new List<Vector2>(); 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); UVs.AddRange(SpriteLoader.instance.GetTileUVs(tile)); } } }

C#

using System.Collections; using System.Collections.Generic; using UnityEngine; using AccidentalNoise; using UnityEditor; namespace TinyWorld { public class World : MonoBehaviour { public Tile[,] tiles; public Material material; Mesh mesh; //Noise noise; ImplicitFractal HeightMap; [SerializeField] int TerrainOctaves = 6; [SerializeField] double TerrainFrequency = 1.25; [SerializeField] int Width = 250; [SerializeField] int Height = 250; [SerializeField] float DeepWater = 0.2f; [SerializeField] float ShallowWater = 0.4f; [SerializeField] float Sand = 0.5f; [SerializeField] float Grass = 0.7f; [SerializeField] float Forest = 0.8f; [SerializeField] float Rock = 0.9f; MapData HeightData; // Use this for initialization void Start() { Initialize(); GetData(HeightMap, ref HeightData); CreateTiles(); GenerateMesh(); var meshs = CombineMeshes(new List<Mesh> { mesh }); GetComponent<MeshFilter>().mesh = meshs; var renderer = GetComponent<MeshRenderer>(); renderer.material = material; } private Mesh CombineMeshes(List<Mesh> meshes) { var combine = new CombineInstance[1]; for (int i = 0; i < meshes.Count; i++) { combine[i].mesh = meshes[i]; combine[i].transform = transform.localToWorldMatrix; } Mesh newMesh = new Mesh(); newMesh.CombineMeshes(combine); return mesh; } // Update is called once per frame void Update() { //Graphics.DrawMesh(mesh, Vector3.zero, Quaternion.identity, material, 0); } private void Initialize() { // Initialize the HeightMap Generator HeightMap = new ImplicitFractal(FractalType.MULTI, BasisType.SIMPLEX, InterpolationType.QUINTIC, TerrainOctaves, TerrainFrequency, UnityEngine.Random.Range(0, int.MaxValue)); } private void GetData(ImplicitModuleBase module, ref MapData mapData) { mapData = new MapData(Width, Height); // loop through each x,y point - get height value for (var x = 0; x < Width; x++) { for (var y = 0; y < Height; y++) { //Sample the noise at smaller intervals float x1 = x / (float)Width; float y1 = y / (float)Height; float value = (float)HeightMap.Get(x1, y1); //keep track of the max and min values found if (value > mapData.Max) mapData.Max = value; if (value < mapData.Min) mapData.Min = value; mapData.Data[x, y] = value; } } } void CreateTiles() { tiles = new Tile[Width, Height]; /*float[,] noiseValues = noise.GetNoiseValues(width, height); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (noiseValues[i, j] > 0.5f) { tiles[i, j] = new Tile(Tile.Type.Grass); } else { tiles[i, j] = new Tile(Tile.Type.Dirt); } } }*/ for (var x = 0; x < Width; x++) { for (var y = 0; y < Height; y++) { float value = HeightData.Data[x, y]; value = (value - HeightData.Min) / (HeightData.Max - HeightData.Min); //HeightMap Analyze if (value < DeepWater) { int randomTree = Random.Range(0, 2); if (randomTree == 0) { tiles[x, y] = new Tile(Tile.Type.DeepWater); } else if(randomTree == 1) { tiles[x, y] = new Tile(Tile.Type.DeepWater); } } else if (value < ShallowWater) { int randomTree = Random.Range(0, 2); if (randomTree == 0) { tiles[x, y] = new Tile(Tile.Type.ShallowWater); } else if (randomTree == 1) { tiles[x, y] = new Tile(Tile.Type.ShallowWater); } } else if (value < Sand) { tiles[x, y] = new Tile(Tile.Type.ShallowWater); } else if (value < Grass) { tiles[x, y] = new Tile(Tile.Type.ShallowWater); } else if (value < Forest) { tiles[x, y] = new Tile(Tile.Type.ShallowWater); } else if (value < Rock) { tiles[x, y] = new Tile(Tile.Type.ShallowWater); } else { tiles[x, y] = new Tile(Tile.Type.ShallowWater); } } } } void GenerateMesh() { MeshData data = new MeshData(tiles); mesh = new Mesh(); // 頂点インデックスのフォーマットを32ビット整数に変更する mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; mesh.vertices = data.vertices.ToArray(); mesh.triangles = data.triangles.ToArray(); mesh.uv = data.UVs.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); } } }

試したこと

イメージ説明

四角形のメッシュを250×250生成しているため、上記画像のように、頂点数やtrianglesがすさまじい数になっているため、実際に描画してみると、メッシュがちらついているように見えます。

イメージ説明

四角形のメッシュを62500個も描画しているので、FPSも低下しています。どのように描画すれば、描画のちらつきやFPSを改善出来るのでしょうか?メッシュの数が多すぎるためとは思いますが、どのようにスクリプトを直せばいいか分からないため、質問しました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity

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