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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

5240閲覧

Unity2D 描画がちらつく

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/07/01 16:59

編集2019/07/01 17:15

前提・実現したいこと

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

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5namespace TinyWorld 6{ 7 public class MeshData 8 { 9 public List<Vector3> vertices; 10 public List<int> triangles; 11 public List<Vector2> UVs; 12 13 public MeshData(Tile[,] data) 14 { 15 vertices = new List<Vector3>(); 16 triangles = new List<int>(); 17 UVs = new List<Vector2>(); 18 19 for (int i = 0; i < data.GetLength(0); i++) 20 { 21 for (int j = 0; j < data.GetLength(1); j++) 22 { 23 CreateSquare(data[i, j], i, j); 24 } 25 } 26 } 27 28 void CreateSquare(Tile tile, int x, int y) 29 { 30 31 vertices.Add(new Vector3(x + 0, y + 0)); 32 vertices.Add(new Vector3(x + 1, y + 0)); 33 vertices.Add(new Vector3(x + 0, y + 1)); 34 vertices.Add(new Vector3(x + 1, y + 1)); 35 36 triangles.Add(vertices.Count - 1); 37 triangles.Add(vertices.Count - 3); 38 triangles.Add(vertices.Count - 4); 39 40 triangles.Add(vertices.Count - 2); 41 triangles.Add(vertices.Count - 1); 42 triangles.Add(vertices.Count - 4); 43 44 45 UVs.AddRange(SpriteLoader.instance.GetTileUVs(tile)); 46 } 47 48 } 49} 50

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using AccidentalNoise; 5using UnityEditor; 6 7namespace TinyWorld 8{ 9 public class World : MonoBehaviour 10 { 11 public Tile[,] tiles; 12 13 public Material material; 14 15 Mesh mesh; 16 17 //Noise noise; 18 19 ImplicitFractal HeightMap; 20 21 [SerializeField] 22 int TerrainOctaves = 6; 23 [SerializeField] 24 double TerrainFrequency = 1.25; 25 26 [SerializeField] 27 int Width = 250; 28 [SerializeField] 29 int Height = 250; 30 31 [SerializeField] 32 float DeepWater = 0.2f; 33 [SerializeField] 34 float ShallowWater = 0.4f; 35 [SerializeField] 36 float Sand = 0.5f; 37 [SerializeField] 38 float Grass = 0.7f; 39 [SerializeField] 40 float Forest = 0.8f; 41 [SerializeField] 42 float Rock = 0.9f; 43 44 MapData HeightData; 45 46 // Use this for initialization 47 void Start() 48 { 49 Initialize(); 50 GetData(HeightMap, ref HeightData); 51 CreateTiles(); 52 GenerateMesh(); 53 54 var meshs = CombineMeshes(new List<Mesh> { mesh }); 55 GetComponent<MeshFilter>().mesh = meshs; 56 var renderer = GetComponent<MeshRenderer>(); 57 renderer.material = material; 58 } 59 60 private Mesh CombineMeshes(List<Mesh> meshes) 61 { 62 var combine = new CombineInstance[1]; 63 for (int i = 0; i < meshes.Count; i++) 64 { 65 combine[i].mesh = meshes[i]; 66 combine[i].transform = transform.localToWorldMatrix; 67 } 68 69 Mesh newMesh = new Mesh(); 70 newMesh.CombineMeshes(combine); 71 return mesh; 72 } 73 74 // Update is called once per frame 75 void Update() 76 { 77 //Graphics.DrawMesh(mesh, Vector3.zero, Quaternion.identity, material, 0); 78 } 79 80 private void Initialize() 81 { 82 // Initialize the HeightMap Generator 83 HeightMap = new ImplicitFractal(FractalType.MULTI, 84 BasisType.SIMPLEX, 85 InterpolationType.QUINTIC, 86 TerrainOctaves, 87 TerrainFrequency, 88 UnityEngine.Random.Range(0, int.MaxValue)); 89 } 90 91 private void GetData(ImplicitModuleBase module, ref MapData mapData) 92 { 93 mapData = new MapData(Width, Height); 94 95 // loop through each x,y point - get height value 96 for (var x = 0; x < Width; x++) 97 { 98 for (var y = 0; y < Height; y++) 99 { 100 //Sample the noise at smaller intervals 101 float x1 = x / (float)Width; 102 float y1 = y / (float)Height; 103 104 float value = (float)HeightMap.Get(x1, y1); 105 106 //keep track of the max and min values found 107 if (value > mapData.Max) mapData.Max = value; 108 if (value < mapData.Min) mapData.Min = value; 109 110 mapData.Data[x, y] = value; 111 } 112 } 113 } 114 115 void CreateTiles() 116 { 117 tiles = new Tile[Width, Height]; 118 119 /*float[,] noiseValues = noise.GetNoiseValues(width, height); 120 121 for (int i = 0; i < width; i++) 122 { 123 for (int j = 0; j < height; j++) 124 { 125 if (noiseValues[i, j] > 0.5f) 126 { 127 tiles[i, j] = new Tile(Tile.Type.Grass); 128 } 129 else 130 { 131 tiles[i, j] = new Tile(Tile.Type.Dirt); 132 } 133 } 134 }*/ 135 136 for (var x = 0; x < Width; x++) 137 { 138 for (var y = 0; y < Height; y++) 139 { 140 float value = HeightData.Data[x, y]; 141 value = (value - HeightData.Min) / (HeightData.Max - HeightData.Min); 142 143 //HeightMap Analyze 144 if (value < DeepWater) 145 { 146 int randomTree = Random.Range(0, 2); 147 if (randomTree == 0) 148 { 149 tiles[x, y] = new Tile(Tile.Type.DeepWater); 150 } 151 else if(randomTree == 1) 152 { 153 tiles[x, y] = new Tile(Tile.Type.DeepWater); 154 } 155 } 156 else if (value < ShallowWater) 157 { 158 int randomTree = Random.Range(0, 2); 159 if (randomTree == 0) 160 { 161 tiles[x, y] = new Tile(Tile.Type.ShallowWater); 162 } 163 else if (randomTree == 1) 164 { 165 tiles[x, y] = new Tile(Tile.Type.ShallowWater); 166 } 167 } 168 else if (value < Sand) 169 { 170 tiles[x, y] = new Tile(Tile.Type.ShallowWater); 171 } 172 else if (value < Grass) 173 { 174 tiles[x, y] = new Tile(Tile.Type.ShallowWater); 175 } 176 else if (value < Forest) 177 { 178 tiles[x, y] = new Tile(Tile.Type.ShallowWater); 179 } 180 else if (value < Rock) 181 { 182 tiles[x, y] = new Tile(Tile.Type.ShallowWater); 183 } 184 else 185 { 186 tiles[x, y] = new Tile(Tile.Type.ShallowWater); 187 } 188 } 189 } 190 191 } 192 193 void GenerateMesh() 194 { 195 MeshData data = new MeshData(tiles); 196 mesh = new Mesh(); 197 198 // 頂点インデックスのフォーマットを32ビット整数に変更する 199 mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; 200 201 mesh.vertices = data.vertices.ToArray(); 202 mesh.triangles = data.triangles.ToArray(); 203 mesh.uv = data.UVs.ToArray(); 204 mesh.RecalculateNormals(); 205 mesh.RecalculateBounds(); 206 } 207 } 208}

試したこと

イメージ説明

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

イメージ説明

四角形のメッシュを62500個も描画しているので、FPSも低下しています。どのように描画すれば、描画のちらつきやFPSを改善出来るのでしょうか?

マップ全体を単一の大きなメッシュとして作成する方法などあると思いますが、自分には出来ませんでした。

メッシュの数が多すぎるためとは思いますが、どのようにスクリプトを直せばいいか分からないため、質問しました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2019/07/01 20:43

別のご質問に「Unity2D メッシュの結合が出来ない」( https://teratail.com/questions/198108 )というものを見かけましたが、もしかしてCombineMeshesの作用を誤解されてはいませんでしょうか? CombineMeshesを使うと複数のMeshオブジェクトを単一のMeshオブジェクトに融合することができ、これによって複数のMeshについてそれぞれドローコールを発行するかわりに一回のドローコールで描画できるようになるため、パフォーマンスが改善するかもしれない...というわけで、理屈としてはドローコールバッチング( https://docs.unity3d.com/ja/current/Manual/DrawCallBatching.html )と似たようなものと言えるかと思います。Meshを結合しても複数のポリゴンが一つのポリゴンに再構成されるわけではないので、ポリゴンの総数は結合前後で変化しないはずです。 おっしゃる通り、125000個ものポリゴンを毎回描画しているのが重大な足かせになっているのは確かだろうと思われます。なんとかこの数を減らしたいところですが、もし仮にワールドマップ全体を1つの四角形...2枚のポリゴンだけで描画できるようになったとすれば、かなりパフォーマンスを改善できそうです(ご質問者さんが想定しているのもそのようなアプローチではないでしょうか)。一旦マップの地形を決定してしまったあとはゲーム中に地形を変化させることがないか、あるいはあったとしてもごくたまにであれば、その方針で行けるかもしれません。ご提示のコードのmaterialのシェーダーコードはどうなっているでしょうか?これもご提示いただけると参考になりそうです。 別のアプローチとしては、マップ全体を単一のMeshオブジェクトで表現するのではなく、逆に細かく分割する...つまり数個~数十個のタイルからなるMeshオブジェクトの集合体にする手もあると思います。 先に挙げたドローコールバッチングのマニュアルには「手動でゲームオブジェクトをマージするのに比べ、ビルトインのバッチにはいくつか利点があります。特に、ゲームオブジェクトは依然として個々にカリングされることが可能です。」との記述もあります。 もし、実際のゲーム中ではご提示の画像のようにワールドマップ全体を表示することはめったになくキャラクター周辺のほんの一部だけを表示するのが主体であれば、このような多数のMeshオブジェクトからなる構成であればカメラから外れたMeshはカリングされ、画面内に映り込んでいる少数のMeshだけが描画されるためにパフォーマンスが改善されるのではないかと思います。 先に申し上げたワールド全体を一つの四角形にするアプローチはおそらく地形レンダリングの仕組みにいくらか手を加えることになる気がしますので、場合によっては困難な可能性があります。それに比べると、後者のアプローチはレンダリング方式の修正箇所が少なく済みそうに思いますので、前者が不可能でも後者なら可能かもしれません。
退会済みユーザー

退会済みユーザー

2019/07/02 08:28

なるほど。CombineMeshesに関して、完全に勘違いしていたようです。沢山ある頂点数などが少なくなると思っていました。マップを数十個のタイルに分割する方法なら、カメラ内のメッシュだけが描画されるので、パフォーマンスが改善されそうです。 materialにはシェーダーは適用しておらず、multipleなテクスチャを適用したものを使用しています。
guest

回答2

0

ベストアンサー

描画効率化案を検討してみました。すみませんがメッシュのちらつき現象についてはご質問者さんとの環境の違いなのかよくわかりませんでした。効率化処置を加えてみても相変わらずちらつくようでしたら、なにか他の原因があるのかもしれません...

#メッシュ分割作戦
まず、MeshDataに元データを縦横に切り分けてメッシュデータ群を作るメソッドを追加しました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5namespace TinyWorld 6{ 7 public class MeshData 8 { 9 // 省略 10 11 public static MeshData[,] CreateMeshData(Tile[,] data, int tileCountPerMeshX = 1, int tileCountPerMeshY = 1) 12 { 13 tileCountPerMeshX = Mathf.Max(tileCountPerMeshX, 1); 14 tileCountPerMeshY = Mathf.Max(tileCountPerMeshY, 1); 15 16 var tileCountX = data.GetLength(0); 17 var tileCountY = data.GetLength(1); 18 19 var meshCountX = Mathf.CeilToInt((float)tileCountX / tileCountPerMeshX); 20 var meshCountY = Mathf.CeilToInt((float)tileCountY / tileCountPerMeshY); 21 22 var meshes = new MeshData[meshCountX, meshCountY]; 23 24 for (var i = 0; i < tileCountX; i += tileCountPerMeshX) 25 { 26 var meshSizeX = Mathf.Min(tileCountPerMeshX, tileCountX - i); 27 for (var j = 0; j < tileCountY; j += tileCountPerMeshY) 28 { 29 var meshSizeY = Mathf.Min(tileCountPerMeshY, tileCountY - j); 30 var subData = new Tile[meshSizeX, meshSizeY]; 31 for (var x = 0; x < meshSizeX; x++) 32 { 33 for (var y = 0; y < meshSizeY; y++) 34 { 35 subData[x, y] = data[i + x, j + y]; 36 } 37 } 38 meshes[i / tileCountPerMeshX, j / tileCountPerMeshY] = new MeshData(subData); 39 } 40 } 41 42 return meshes; 43 } 44 } 45}

そしてWorldは下記のように改造しました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using AccidentalNoise; 5using UnityEditor; 6 7namespace TinyWorld 8{ 9 public class World : MonoBehaviour 10 { 11 public Tile[,] tiles; 12 13 public Material material; 14 15 Mesh mesh; 16 17 //Noise noise; 18 19 ImplicitFractal HeightMap; 20 21 [SerializeField] 22 int TerrainOctaves = 6; 23 [SerializeField] 24 double TerrainFrequency = 1.25; 25 26 [SerializeField] 27 int Width = 250; 28 [SerializeField] 29 int Height = 250; 30 31 // 1メッシュあたりの幅・高さを追加 32 [SerializeField] 33 int WidthPerMesh = 10; 34 [SerializeField] 35 int HeightPerMesh = 10; 36 37 [SerializeField] 38 float DeepWater = 0.2f; 39 [SerializeField] 40 float ShallowWater = 0.4f; 41 [SerializeField] 42 float Sand = 0.5f; 43 [SerializeField] 44 float Grass = 0.7f; 45 [SerializeField] 46 float Forest = 0.8f; 47 [SerializeField] 48 float Rock = 0.9f; 49 50 MapData HeightData; 51 52 // Use this for initialization 53 void Start() 54 { 55 Initialize(); 56 GetData(HeightMap, ref HeightData); 57 CreateTiles(); 58 59 // GenerateMeshに代わってGenerateMeshesでメッシュ群を作る 60 var meshes = this.GenerateMeshes(); 61 var meshCountX = meshes.GetLength(0); 62 var meshCountY = meshes.GetLength(1); 63 64 // 自分自身のMeshRendererは使用せず... 65 GetComponent<MeshRenderer>().enabled = false; 66 67 // 子オブジェクトを作ってメッシュをセットする 68 for (var i = 0; i < meshCountX; i++) 69 { 70 for (var j = 0; j < meshCountY; j++) 71 { 72 var m = meshes[i, j]; 73 var child = new GameObject(m.name); 74 child.transform.SetParent(this.transform, false); 75 child.transform.localPosition = new Vector3(i * this.WidthPerMesh, j * this.HeightPerMesh); 76 child.AddComponent<MeshFilter>().mesh = m; 77 child.AddComponent<MeshRenderer>().sharedMaterial = this.material; 78 } 79 } 80 } 81 82 // 省略 83 84 Mesh[,] GenerateMeshes() 85 { 86 var data = MeshData.CreateMeshData(tiles, this.WidthPerMesh, this.HeightPerMesh); 87 var meshCountX = data.GetLength(0); 88 var meshCountY = data.GetLength(1); 89 var meshes = new Mesh[meshCountX, meshCountY]; 90 for (var i = 0; i < meshCountX; i++) 91 { 92 for (var j = 0; j < meshCountY; j++) 93 { 94 var subData = data[i, j]; 95 var m = new Mesh(); 96 m.name = $"Mesh ({i}, {j})"; 97 m.vertices = subData.vertices.ToArray(); 98 m.triangles = subData.triangles.ToArray(); 99 m.uv = subData.UVs.ToArray(); 100 m.RecalculateNormals(); 101 m.RecalculateBounds(); 102 meshes[i, j] = m; 103 } 104 } 105 106 return meshes; 107 } 108 } 109}

実行すると、下図のように子オブジェクトが作られました。

図1

ワールドマップ全体が映る視点だとTrisが125.0k、つまり125000個を示していますが...

図2

これぐらいの距離に寄るとTrisは14.0kとなり、全ポリゴン125000個中14000個だけが描画されています。

図3

#2枚ポリゴン化作戦
こちらはシェーダーをカスタマイズする必要があるでしょう。Worldmaterialには下記のようなシェーダーを使用し...

ShaderLab

1Shader "Unlit/World" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 _DataTex ("Data", 2D) = "black" {} 7 _Width ("Width", Int) = 250 8 _Height ("Height", Int) = 250 9 } 10 SubShader 11 { 12 Tags { "RenderType"="Opaque" } 13 14 Pass 15 { 16 CGPROGRAM 17 #pragma vertex vert 18 #pragma fragment frag 19 20 #include "UnityCG.cginc" 21 22 struct appdata 23 { 24 float4 vertex : POSITION; 25 float2 uv : TEXCOORD0; 26 }; 27 28 struct v2f 29 { 30 float2 uv : TEXCOORD0; 31 float4 vertex : SV_POSITION; 32 }; 33 34 sampler2D _MainTex; 35 float4 _MainTex_ST; 36 sampler2D _DataTex; 37 float4 _DataTex_TexelSize; 38 int _Width; 39 int _Height; 40 41 v2f vert(appdata v) 42 { 43 v2f o; 44 o.vertex = UnityObjectToClipPos(v.vertex); 45 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 46 return o; 47 } 48 49 fixed4 frag(v2f i) : SV_Target 50 { 51 float2 worldSize = float2(_Width, _Height); 52 float2 worldUv = i.uv * worldSize; 53 float2 dataUv = (floor(worldUv) + 0.5) * _DataTex_TexelSize.xy; 54 float2 tileUv = frac(worldUv); 55 float4 texCorners = tex2D(_DataTex, dataUv); 56 float2 uv = lerp(texCorners.xy, texCorners.zw, tileUv); 57 fixed4 col = tex2D(_MainTex, uv); 58 return col; 59 } 60 ENDCG 61 } 62 } 63}

Worldは下記のようにしました。MeshDataは当初のままです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using AccidentalNoise; 5using UnityEditor; 6 7namespace TinyWorld 8{ 9 public class World : MonoBehaviour 10 { 11 // 省略 12 13 // Use this for initialization 14 void Start() 15 { 16 Initialize(); 17 GetData(HeightMap, ref HeightData); 18 CreateTiles(); 19 20 // メッシュを生成し、マテリアルにデータをセットする 21 material.SetTexture("_DataTex", GenerateMesh()); 22 material.SetInt("_Width", this.Width); 23 material.SetInt("_Height", this.Height); 24 25 GetComponent<MeshFilter>().mesh = mesh; 26 var renderer = GetComponent<MeshRenderer>(); 27 renderer.material = material; 28 } 29 30 // 省略 31 32 Texture2D GenerateMesh() 33 { 34 MeshData data = new MeshData(tiles); 35 36 // メッシュはワールド全体を覆う1個の四角形とし... 37 mesh = new Mesh(); 38 mesh.vertices = new[] 39 { 40 Vector3.zero, 41 new Vector3(0.0f, this.Height, 0.0f), 42 new Vector3(this.Width, 0.0f, 0.0f), 43 new Vector3(this.Width, this.Height, 0.0f) 44 }; 45 mesh.uv = new[] 46 { 47 Vector2.zero, 48 Vector2.up, 49 Vector2.right, 50 Vector2.one 51 }; 52 mesh.triangles = new[] 53 { 54 0, 1, 2, 55 3, 2, 1 56 }; 57 mesh.RecalculateNormals(); 58 mesh.RecalculateBounds(); 59 60 // タイルの左下、右上のUVをテクスチャにして返す 61 var dataTexWidth = Mathf.NextPowerOfTwo(this.Width); 62 var dataTexHeight = Mathf.NextPowerOfTwo(this.Height); 63 var dataTex = new Texture2D(dataTexWidth, dataTexHeight, TextureFormat.RGBAFloat, false); 64 var dataColors = new Color[dataTexWidth * dataTexHeight]; 65 var uvs = data.UVs.ToArray(); 66 for (var i = 0; i < this.Width; i++) 67 { 68 var dataOffset = i * dataTexHeight; 69 var uvOffset = i * this.Height * 4; 70 for (var j = 0; j < this.Height; j++) 71 { 72 var uvIndex = (j * 4) + uvOffset; 73 var bottomLeft = uvs[uvIndex]; 74 var topRight = uvs[uvIndex + 3]; 75 dataColors[j + dataOffset] = new Color(bottomLeft.x, bottomLeft.y, topRight.x, topRight.y); 76 } 77 } 78 dataTex.SetPixels(dataColors); 79 dataTex.Apply(); 80 return dataTex; 81 } 82 } 83}

これによりメッシュは単一の四角形となり...

図4

個々のタイルのUVデータはテクスチャとしてマテリアルに送られます。

図5

下図のように、ワールド全域を描画してもTrisは4となりました。カメラのMSAAを切ると、Trisがさらに2まで低下します。

図6

#格子問題について
たとえば、もし下図のようなタイル同士がぴったりくっついたテクスチャを使用している場合...

図7

上図は1タイル32×32ですが、これを縦横に繰り返して64×64にして...

図8

UV座標としては中心の32×32を切り出すようにしてはいかがでしょう。

図9

上下左右に16ピクセルも余白を設けていますが、ワールドマップ全域の描画にも対応するにはこれぐらい広めにしてやった方がいいんじゃないかと思います。

図10

さらにテクスチャの「Generate Mip Maps」もオンにしてやればさらに格子模様を低減できるかと思いますが、遠くから見たときのテクスチャのディテールが潰れてしまいました。
ある意味正しい見え方だとも言えるかもしれませんが、これが許容しがたいようでしたらさらに追加の対策を施す必要がありそうです(ディテールを保持した独自のミップマップをテクスチャにセットするとか...?)。

図11

投稿2019/07/02 22:29

編集2019/07/04 01:09
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/03 14:19 編集

いつも参考になる回答ありがとうございます。メッシュのちらつきは、CameraのSizeが変更されたときに発生するようです。
Bongo

2019/07/04 01:10

ちらつきとおっしゃるのは、もしかして私の投稿したスクリーンショットにも現れている、ブサイクな縦横の格子模様のことでしょうかね? マウスホイールを操作すると縮尺によって格子の現れ方がコロコロ変わり、それが見苦しいという意味でしょうか。 それでしたら、おそらくタイルテクスチャの中で隣り合ったタイルの色が漏れ込んでいるためである可能性がありますね。追記しましたような処置を施すと変化はあるでしょうか。 それとは違うようでしたら、k.matsudaさんのおっしゃるように新規の質問投稿にして、多くの人にあらためて見てもらえるようにした方がいいかもしれません。 その際には、できればちらつき現象の様子が分かるような映像を撮影していただけるとヒントになりそうですが、静止画と違って面倒かもしれませんね...何とか詳しく状況が伝わるようなご説明をお願いしたいところです。
退会済みユーザー

退会済みユーザー

2019/07/04 08:44

回答ありがとうございました。新規の質問を投稿してみようと思います。
guest

0

マウスのスクロールを使って、マップを拡大、縮小するスクリプトを書きました。ですが、CameraのSizeが変動すると、メッシュ全体がちらついて見えるような現象が発生します。

CameraのSizeを変更するスクリプト↓

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CameraControlScript : MonoBehaviour 6{ 7 public Vector2 SPEED = new Vector2(0.3f, 0.3f); 8 9 public float zoomSpeed = 100; 10 public float targetOrtho; 11 public float smoothSpeed = 200; 12 public float minOrtho = 20; 13 public float maxOrtho = 130; 14 15 // Use this for initialization 16 void Start() 17 { 18 targetOrtho = Camera.main.orthographicSize; 19 } 20 21 // Update is called once per frame 22 void LateUpdate() 23 { 24 Vector3 pos = transform.position; 25 pos.z = -10; 26 pos.x = Mathf.Clamp(pos.x, 75, 175); 27 pos.y = Mathf.Clamp(pos.y, 20, 230); 28 29 transform.position = pos; 30 Move(); 31 32 float scroll = Input.GetAxis("Mouse ScrollWheel"); 33 if (scroll != 0.0f) 34 { 35 targetOrtho -= scroll * zoomSpeed; 36 targetOrtho = Mathf.Clamp(targetOrtho, minOrtho, maxOrtho); 37 } 38 39 Camera.main.orthographicSize = Mathf.RoundToInt(Mathf.MoveTowards(Camera.main.orthographicSize, targetOrtho, smoothSpeed * Time.deltaTime)); 40 41 float speed = Camera.main.orthographicSize / 43.333f; 42 SPEED = new Vector2(speed, speed); 43 } 44 45 // 移動関数 46 void Move() 47 { 48 Vector3 Position = transform.position; 49 50 if (Input.GetKey("left")) 51 { 52 Position.x -= SPEED.x; 53 } 54 else if (Input.GetKey("right")) 55 { 56 Position.x += SPEED.x; 57 } 58 else if (Input.GetKey("up")) 59 { 60 Position.y += SPEED.y; 61 } 62 else if (Input.GetKey("down")) 63 { 64 Position.y -= SPEED.y; 65 } 66 67 transform.position = Position; 68 } 69} 70

テクスチャの設定を変えるなどしてみたのですが、変化はありませんでした。CameraのSizeが変更されると、メッシュの見え方が変わってしまうようです。

どのようにすればよいでしょうか? 回答お願いします。

投稿2019/07/03 14:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k.matsuda

2019/07/03 16:39

この質問は解決済みにして、改に質問する方が良いと思いますよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問