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

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

ただいまの
回答率

89.11%

Unity2D 描画がちらつく

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 917

t2t21212

score 62

前提・実現したいこと

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

該当のソースコード

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));
        }

    }
}
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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Bongo

    2019/07/02 05: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だけが描画されるためにパフォーマンスが改善されるのではないかと思います。

    先に申し上げたワールド全体を一つの四角形にするアプローチはおそらく地形レンダリングの仕組みにいくらか手を加えることになる気がしますので、場合によっては困難な可能性があります。それに比べると、後者のアプローチはレンダリング方式の修正箇所が少なく済みそうに思いますので、前者が不可能でも後者なら可能かもしれません。

    キャンセル

  • t2t21212

    2019/07/02 17:28

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

    materialにはシェーダーは適用しておらず、multipleなテクスチャを適用したものを使用しています。

    キャンセル

回答 2

checkベストアンサー

+1

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

メッシュ分割作戦

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace TinyWorld
{
    public class MeshData
    {
        // 省略

        public static MeshData[,] CreateMeshData(Tile[,] data, int tileCountPerMeshX = 1, int tileCountPerMeshY = 1)
        {
            tileCountPerMeshX = Mathf.Max(tileCountPerMeshX, 1);
            tileCountPerMeshY = Mathf.Max(tileCountPerMeshY, 1);

            var tileCountX = data.GetLength(0);
            var tileCountY = data.GetLength(1);

            var meshCountX = Mathf.CeilToInt((float)tileCountX / tileCountPerMeshX);
            var meshCountY = Mathf.CeilToInt((float)tileCountY / tileCountPerMeshY);

            var meshes = new MeshData[meshCountX, meshCountY];

            for (var i = 0; i < tileCountX; i += tileCountPerMeshX)
            {
                var meshSizeX = Mathf.Min(tileCountPerMeshX, tileCountX - i);
                for (var j = 0; j < tileCountY; j += tileCountPerMeshY)
                {
                    var meshSizeY = Mathf.Min(tileCountPerMeshY, tileCountY - j);
                    var subData = new Tile[meshSizeX, meshSizeY];
                    for (var x = 0; x < meshSizeX; x++)
                    {
                        for (var y = 0; y < meshSizeY; y++)
                        {
                            subData[x, y] = data[i + x, j + y];
                        }
                    }
                    meshes[i / tileCountPerMeshX, j / tileCountPerMeshY] = new MeshData(subData);
                }
            }

            return meshes;
        }
    }
}


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

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;

        // 1メッシュあたりの幅・高さを追加
        [SerializeField]
        int WidthPerMesh = 10;
        [SerializeField]
        int HeightPerMesh = 10;

        [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に代わってGenerateMeshesでメッシュ群を作る
            var meshes = this.GenerateMeshes();
            var meshCountX = meshes.GetLength(0);
            var meshCountY = meshes.GetLength(1);

            // 自分自身のMeshRendererは使用せず...
            GetComponent<MeshRenderer>().enabled = false;

            // 子オブジェクトを作ってメッシュをセットする
            for (var i = 0; i < meshCountX; i++)
            {
                for (var j = 0; j < meshCountY; j++)
                {
                    var m = meshes[i, j];
                    var child = new GameObject(m.name);
                    child.transform.SetParent(this.transform, false);
                    child.transform.localPosition = new Vector3(i * this.WidthPerMesh, j * this.HeightPerMesh);
                    child.AddComponent<MeshFilter>().mesh = m;
                    child.AddComponent<MeshRenderer>().sharedMaterial = this.material;
                }
            }
        }

        // 省略

        Mesh[,] GenerateMeshes()
        {
            var data = MeshData.CreateMeshData(tiles, this.WidthPerMesh, this.HeightPerMesh);
            var meshCountX = data.GetLength(0);
            var meshCountY = data.GetLength(1);
            var meshes = new Mesh[meshCountX, meshCountY];
            for (var i = 0; i < meshCountX; i++)
            {
                for (var j = 0; j < meshCountY; j++)
                {
                    var subData = data[i, j];
                    var m = new Mesh();
                    m.name = $"Mesh ({i}, {j})";
                    m.vertices = subData.vertices.ToArray();
                    m.triangles = subData.triangles.ToArray();
                    m.uv = subData.UVs.ToArray();
                    m.RecalculateNormals();
                    m.RecalculateBounds();
                    meshes[i, j] = m;
                }
            }

            return meshes;
        }
    }
}

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

図1

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

図2

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

図3

2枚ポリゴン化作戦

こちらはシェーダーをカスタマイズする必要があるでしょう。Worldmaterialには下記のようなシェーダーを使用し...

Shader "Unlit/World"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _DataTex ("Data", 2D) = "black" {}
        _Width ("Width", Int) = 250
        _Height ("Height", Int) = 250
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _DataTex;
            float4 _DataTex_TexelSize;
            int _Width;
            int _Height;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                float2 worldSize = float2(_Width, _Height);
                float2 worldUv = i.uv * worldSize;
                float2 dataUv = (floor(worldUv) + 0.5) * _DataTex_TexelSize.xy;
                float2 tileUv = frac(worldUv);
                float4 texCorners = tex2D(_DataTex, dataUv);
                float2 uv = lerp(texCorners.xy, texCorners.zw, tileUv);
                fixed4 col = tex2D(_MainTex, uv);
                return col;
            }
            ENDCG
        }
    }
}

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AccidentalNoise;
using UnityEditor;

namespace TinyWorld
{
    public class World : MonoBehaviour
    {
        // 省略

        // Use this for initialization
        void Start()
        {
            Initialize();
            GetData(HeightMap, ref HeightData);
            CreateTiles();

            // メッシュを生成し、マテリアルにデータをセットする
            material.SetTexture("_DataTex", GenerateMesh());
            material.SetInt("_Width", this.Width);
            material.SetInt("_Height", this.Height);

            GetComponent<MeshFilter>().mesh = mesh;
            var renderer = GetComponent<MeshRenderer>();
            renderer.material = material;
        }

        // 省略

        Texture2D GenerateMesh()
        {
            MeshData data = new MeshData(tiles);

            // メッシュはワールド全体を覆う1個の四角形とし...
            mesh = new Mesh();
            mesh.vertices = new[]
            {
                Vector3.zero,
                new Vector3(0.0f, this.Height, 0.0f),
                new Vector3(this.Width, 0.0f, 0.0f),
                new Vector3(this.Width, this.Height, 0.0f)
            };
            mesh.uv = new[]
            {
                Vector2.zero,
                Vector2.up,
                Vector2.right,
                Vector2.one
            };
            mesh.triangles = new[]
            {
                0, 1, 2,
                3, 2, 1
            };
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            // タイルの左下、右上のUVをテクスチャにして返す
            var dataTexWidth = Mathf.NextPowerOfTwo(this.Width);
            var dataTexHeight = Mathf.NextPowerOfTwo(this.Height);
            var dataTex = new Texture2D(dataTexWidth, dataTexHeight, TextureFormat.RGBAFloat, false);
            var dataColors = new Color[dataTexWidth * dataTexHeight];
            var uvs = data.UVs.ToArray();
            for (var i = 0; i < this.Width; i++)
            {
                var dataOffset = i * dataTexHeight;
                var uvOffset = i * this.Height * 4;
                for (var j = 0; j < this.Height; j++)
                {
                    var uvIndex = (j * 4) + uvOffset;
                    var bottomLeft = uvs[uvIndex];
                    var topRight = uvs[uvIndex + 3];
                    dataColors[j + dataOffset] = new Color(bottomLeft.x, bottomLeft.y, topRight.x, topRight.y);
                }
            }
            dataTex.SetPixels(dataColors);
            dataTex.Apply();
            return dataTex;
        }
    }
}

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

図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/03 23:17 編集

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

    キャンセル

  • 2019/07/04 10:10

    ちらつきとおっしゃるのは、もしかして私の投稿したスクリーンショットにも現れている、ブサイクな縦横の格子模様のことでしょうかね?
    マウスホイールを操作すると縮尺によって格子の現れ方がコロコロ変わり、それが見苦しいという意味でしょうか。
    それでしたら、おそらくタイルテクスチャの中で隣り合ったタイルの色が漏れ込んでいるためである可能性がありますね。追記しましたような処置を施すと変化はあるでしょうか。

    それとは違うようでしたら、k.matsudaさんのおっしゃるように新規の質問投稿にして、多くの人にあらためて見てもらえるようにした方がいいかもしれません。
    その際には、できればちらつき現象の様子が分かるような映像を撮影していただけるとヒントになりそうですが、静止画と違って面倒かもしれませんね...何とか詳しく状況が伝わるようなご説明をお願いしたいところです。

    キャンセル

  • 2019/07/04 17:44

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

    キャンセル

0

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraControlScript : MonoBehaviour
{
    public Vector2 SPEED = new Vector2(0.3f, 0.3f);

    public float zoomSpeed = 100;
    public float targetOrtho;
    public float smoothSpeed = 200;
    public float minOrtho = 20;
    public float maxOrtho = 130;

    // Use this for initialization
    void Start()
    {
        targetOrtho = Camera.main.orthographicSize;
    }

    // Update is called once per frame
    void LateUpdate()
    {
        Vector3 pos = transform.position;
        pos.z = -10;
        pos.x = Mathf.Clamp(pos.x, 75, 175);
        pos.y = Mathf.Clamp(pos.y, 20, 230);

        transform.position = pos;
        Move();

        float scroll = Input.GetAxis("Mouse ScrollWheel");
        if (scroll != 0.0f)
        {
            targetOrtho -= scroll * zoomSpeed;
            targetOrtho = Mathf.Clamp(targetOrtho, minOrtho, maxOrtho);
        }

        Camera.main.orthographicSize = Mathf.RoundToInt(Mathf.MoveTowards(Camera.main.orthographicSize, targetOrtho, smoothSpeed * Time.deltaTime));

        float speed = Camera.main.orthographicSize / 43.333f;
        SPEED = new Vector2(speed, speed);
    }

    // 移動関数
    void Move()
    {
        Vector3 Position = transform.position;

        if (Input.GetKey("left"))
        {
            Position.x -= SPEED.x;
        }
        else if (Input.GetKey("right"))
        { 
            Position.x += SPEED.x;
        }
        else if (Input.GetKey("up"))
        { 
            Position.y += SPEED.y;
        }
        else if (Input.GetKey("down"))
        { 
            Position.y -= SPEED.y;
        }

        transform.position = Position;
    }
}

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/04 01:39

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

    キャンセル

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

  • ただいまの回答率 89.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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