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

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

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

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

Unity

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

Q&A

解決済

2回答

2747閲覧

Unity2D Graphics.DrawMesh 描画順序

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

1クリップ

投稿2019/04/18 13:32

編集2019/04/18 13:36

前提・実現したいこと

Graphics.DrawMeshで描画しているメッシュの描画順序を変えたい

該当のソースコード

C#

1using UnityEngine; 2using System.Collections; 3 4public class PlayerControlScript : MonoBehaviour 5{ 6 Mesh mesh; 7 public Material material; 8 9 public static PlayerControlScript instance { get; private set; } 10 11 public float x { get; private set; } 12 public float y { get; private set; } 13 14 private void Start() 15 { 16 instance = this; 17 } 18 19 private void Update() 20 { 21 Vector3 vector = new Vector3(x, y, 0); 22 Graphics.DrawMesh(mesh, vector, Quaternion.AngleAxis(0.0f, new Vector3(1.0f, 0.0f, 0.0f)), material, 0); 23 } 24 25 public void PlayerGenerate() 26 { 27 mesh = new Mesh(); 28 Vector2 watercoo = World.instance.WaterCoordinates[0]; 29 x = watercoo.x; 30 y = watercoo.y; 31 32 mesh.vertices = new Vector3[] 33 { 34 new Vector3 (0, 0, 0), 35 new Vector3 (0, 1f, 0), 36 new Vector3 (1f, 0, 0), 37 new Vector3 (1f, 1f, 0), 38 }; 39 40 mesh.uv = new Vector2[] 41 { 42 new Vector2 (0, 0), 43 new Vector2 (0, 1), 44 new Vector2 (1, 0), 45 new Vector2 (1, 1), 46 }; 47 48 mesh.triangles = new int[] 49 { 50 0, 1, 2, 51 1, 3, 2, 52 }; 53 54 mesh.RecalculateNormals(); 55 mesh.RecalculateBounds(); 56 } 57}

試したこと

PlayerControlScriptで生成するメッシュは、予め生成していたメッシュの上に生成したいのですが、メッシュのZ位置を変えてもなにも変わりませんでした。

どのようにすれば、Graphics.DrawMeshで描画順序を変えることが出来るのでしょうか?
回答お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

シェーダーに詳しくないのですが、ZTestを設定して、前面に押し出してみました。
結果として、最初に生成していたシェーダーの上に描画されました。

ShaderLab

1Shader "Unlit/ZWriteShader" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 } 7 SubShader 8 { 9 Tags { "RenderType"="Opaque" "Queue"="Geometry+5" } 10 ZTest Always 11 LOD 100 12 13 ZWrite Off 14 Blend SrcAlpha OneMinusSrcAlpha 15 16 Pass 17 { 18 CGPROGRAM 19 #pragma vertex vert 20 #pragma fragment frag 21 // make fog work 22 #pragma multi_compile_fog 23 24 #include "UnityCG.cginc" 25 26 struct appdata 27 { 28 float4 vertex : POSITION; 29 float2 uv : TEXCOORD0; 30 }; 31 32 struct v2f 33 { 34 float2 uv : TEXCOORD0; 35 UNITY_FOG_COORDS(1) 36 float4 vertex : SV_POSITION; 37 }; 38 39 sampler2D _MainTex; 40 float4 _MainTex_ST; 41 42 v2f vert (appdata v) 43 { 44 v2f o; 45 o.vertex = UnityObjectToClipPos(v.vertex); 46 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 47 UNITY_TRANSFER_FOG(o,o.vertex); 48 return o; 49 } 50 51 fixed4 frag (v2f i) : SV_Target 52 { 53 // sample the texture 54 fixed4 col = tex2D(_MainTex, i.uv); 55 // apply fog 56 UNITY_APPLY_FOG(i.fogCoord, col); 57 return col; 58 } 59 ENDCG 60 } 61 } 62} 63

投稿2019/04/19 03:28

編集2019/04/19 08:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

メッシュの頂点座標、あるいはDrawMesh時の座標を操作しても、マテリアルのZTestZWriteをうまく設定していない限りDrawMeshが行われた順にどんどん上描きされていく形になるかと思います。

それぞれのスクリプトのUpdate(に限りませんが...)がどの順番で実行されるかは不定なので(Unity内部ではルールがあるのでしょうが、それをあてにするべきではないでしょう)、何らかの手で順序をコントロールする必要がありそうです。
Script Execution Orderを調整してPlayerControlScriptが他のスクリプトよりも後に実行されるようにするか、あるいはプレイヤーの描画をLateUpdateタイミングまで遅らせるというのはどうでしょうか?

C#

1 private void LateUpdate() 2 { 3 Vector3 vector = new Vector3(x, y, 0); 4 Graphics.DrawMesh(mesh, vector, Quaternion.AngleAxis(0.0f, new Vector3(1.0f, 0.0f, 0.0f)), material, 0); 5 }

投稿2019/04/18 21:44

編集2019/04/18 21:46
Bongo

総合スコア10807

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

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

退会済みユーザー

退会済みユーザー

2019/04/19 03:15

LateUpdateを使用してみましたが、予め生成していたメッシュに隠れて見えなくなってしまいました。
退会済みユーザー

退会済みユーザー

2019/04/19 03:29

回答ありがとうございました。
Bongo

2019/04/19 03:39

すみません、ご質問を誤解していたような気がします。「予め生成していたメッシュ」というのを、以前のご質問に出てきた「World」のことだろうと勝手に考えてしまいましたが、そうではなくて「Unityエディタ上であらかじめシーンに配置した、メッシュを持つオブジェクト」を指すということでしょうか? のちほど案を再検討してみます。参考としてうかがいたいのですが、あらかじめ配置したメッシュのマテリアルと、このプレイヤーのDrawMeshの時に使っているマテリアルはどのようなものでしょうか。マテリアルをインスペクタで見たとき、マテリアル名の下に使用しているシェーダー名が表示されているかと思いますが、それが分かると検討の参考になりそうです。
Bongo

2019/04/19 03:41

すみません、コメントのタイミングがご回答にかぶってしまいました。解決しましたようでなによりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問