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

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

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

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

Unity

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

Q&A

0回答

633閲覧

ゲーム内のレーダーの表示がうまくいきません

gemfighter

総合スコア38

C#

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

Unity

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

0グッド

0クリップ

投稿2021/07/25 13:45

リンク内容

現在、ゲーム内にレーダーを実装しようとしていますが、敵の位置を丸で表示したいなと考えています。
そこで、斜辺と角度は解っているので、そこから三角関数で底辺と高さを求める形で座標x,yを求めてその位置に丸を表示させようとしていますが、うまくいきません。

リンクは現在のゲームの画面です。
今は敵の位置は線で表現しています。

エンジンはUnityを使っています、レーダーは頂点・フラグメントシェーダで描写しています。

もし良ければ助言ください。

Shader

1Shader "Unlit/RadarShader" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 _FValue("Rot_Value",float) = 0 7 8 //_FDIST("Dist_Value",float[3]) = {1,2,1} 9 10 } 11 SubShader 12 { 13 Tags { "RenderType"="Opaque" } 14 LOD 100 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 uniform float _FValue; //_FValueは角度 42 uniform float _FDIST[360]; //_FDIST[360]が各角度の距離情報 43 44 v2f vert (appdata v) 45 { 46 v2f o; 47 o.vertex = UnityObjectToClipPos(v.vertex); 48 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 49 UNITY_TRANSFER_FOG(o,o.vertex); 50 return o; 51 } 52 53 //円周率 54 #define PI 3.14159265359 55 56 //底辺と高さの比から角度を返す 57 float rd(float2 st) { 58 float dx = 0.5 - st.x;//中心点とx座標の差(底辺) 59 float dy = 0.5 - st.y;//中心点とy座標の差(高さ) 60 return atan2(dx, dy);//底辺と高さの比から角度を返す 61 } 62 63 //白い円と黒い円を足して線の円を描写している 64 float4 disc_guide(float2 st,float radius, float width) { 65 66 //distance(x, y)・・・xとyの距離を返す 67 //step(a,x)・・・グラフのステップ xがaより大きければ1、a未満なら0を返す 68 69 fixed r = distance(st,fixed2(0.5,0.5)); 70 return step(radius - width, r)*step(1 - radius,1-r); 71 } 72 73 //レーダーの線 74 float disc(float2 st) { 75 //線の円を三つ描写 76 return disc_guide(st, 0.1, 0.01) + disc_guide(st, 0.3, 0.01) + disc_guide(st, 0.5, 0.01); 77 78 } 79 80 //グラデーション 81 float grad_rot(float2 st,float width) { 82 83 float rad = rd(st); 84 rad = rad * 180 / PI;//ここで度数法に直す 85 rad = rad + 180;//ついでに真上を0度(360度)に直す 86 87 //360°以内に直すため、%360する 88 float offset = (_FValue ) % 360; 89 90 float d1 = distance(rad, offset) / width;//現在 91 float d2 = distance(rad, offset+360) / width;//境目の前 92 float d3 = distance(rad, offset-360) / width;//境目の後 93 94 return 1-min(min(d1, d2), d3); 95 } 96 97 //レーダー部分 98 float main_radar(float2 st) { 99 100 float rad = rd(st); 101 rad = rad * 180 / PI;//ここで度数法に直す 102 rad = rad + 180;//ついでに真上を0度(360度)に直す 103 104 //_FValueは角度 105 float offset = (_FValue ) % 360; 106 float offset2 = (_FValue ) % 360 + 360; 107 108 //0°から回転する角度以上 109 float s1 = step(rad, offset); 110 float s2 = step(offset-60, rad); 111 112 //60°から回転する角度以下(基準点をまたいだ時、足りない角度をこれで描写する) 113 float s3 = step(rad, offset2); 114 float s4 = step(offset2-60, rad); 115 116 117 return (s1 * s2 + s3 * s4) *grad_rot(st,60)+disc(st); 118 } 119 120 //敵の位置表示(現在) 121 float main_position(float2 st) { 122 123 float rad = rd(st); 124 rad = (rad * 180 / PI ) +179;//度数法に直してから1度ずらした位置に戻す 125 126 float r = distance(st, fixed2(0.5, 0.5)); 127 float dist = _FDIST[rad]; 128 129 //赤い線表示と黒い線表示を組み合わせて描写している 130 return (step(dist + 2.0f,r) * step(r, dist + 2.05f)); 131 } 132 133 //敵の位置表示(予定) 134 float sarcle(float2 st) { 135 136 float rad = rd(st); 137 rad = (rad * 180 / PI) + 179;//度数法に直してから1度ずらした位置に戻す 138 float dist = _FDIST[rad] + 2.0f; 139 140 float ifrad = 0.0f; 141 float x = 0.0f; 142 float y = 0.0f; 143 144 //90度までの時 145 if (_FValue <= 90) { 146 ifrad = 90 - _FValue; 147 x = dist * cos(ifrad); 148 y = dist * sin(ifrad); 149 } 150 //180度までの時 151 else if (_FValue <= 180) { 152 ifrad = 180 - _FValue; 153 x = dist * cos(ifrad) * -1; 154 y = dist * sin(ifrad); 155 } 156 //270度までの時 157 else if (_FValue <= 270) { 158 ifrad = 270 - _FValue; 159 x = dist * cos(ifrad) * -1; 160 y = dist * sin(ifrad) * -1; 161 } 162 //359度までの時 163 else if (_FValue <= 359) { 164 ifrad = 360 - _FValue; 165 x = dist * cos(ifrad) * -1; 166 y = dist * sin(ifrad); 167 } 168 float d = distance(float2(0.5 + x, 0.5 + y), st); 169 return step(d, 0.01); 170 } 171 172 //描写 173 fixed4 frag(v2f i) : SV_Target 174 { 175 //i.uvはモデルの一番右上の部分の所 176 float2 st = i.uv; 177 178 fixed4 black = fixed4(0, 0, 0, 0); 179 fixed4 write = fixed4(1, 1, 1, 1); 180 fixed4 green = fixed4(0, 1, 0, 0); 181 182 return float4(main_position(st), 0, 0, 1) + float4(0, main_radar(st), 0, 1); 183 //return float4(sarcle(st), 0, 0, 1) + float4(0, main_radar(st), 0, 1); 184 } 185 186 187 188 ENDCG 189 } 190 } 191}

C#

1//ここで距離を取得しています 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6using UnityEngine.UI; 7 8public class RaycastScript : MonoBehaviour 9{ 10 //光の発射距離 11 public float raser_distance_area = 200.0f; 12 13 public Image rendray; 14 float[] hoge = new float[360]; //各角度の距離情報 15 int angleinfo_ray = 0; 16 17 18 // Start is called before the first frame update 19 void Start() 20 { 21 22 rendray = GameObject.Find("RadarImage").GetComponent<Image>(); 23 for (int i = 0; i < 360; i++) 24 { 25 hoge[i] = 0.0f; 26 } 27 28 //RaderShaderの_FDISTに値を代入している 29 rendray.material.SetFloatArray("_FDIST", hoge); 30 31 } 32 33 // Update is called once per frame 34 void Update() 35 { 36 //光 37 Ray ray = new Ray(transform.position, transform.forward); 38 39 RaycastHit hit; 40 41 //transform.localEulerAngles.yは、オブジェクトから見た相対的なオイラー角としての回転値 42 //オイラー角は、3次元の回転と回転を構成する3つの別々の角度を表す用語 43 angleinfo_ray = (int)(transform.localEulerAngles.y)%360; 44 //Debug.Log(angleinfo_ray); 45 46 //outは必ず引数の値が入る宣言 47 //rayは光の開始地点 48 //hitは当たったものの情報 49 //raser_distance_areaは光の発射距離 50 if (Physics.Raycast(ray,out hit, raser_distance_area)) 51 { 52 if (hit.collider.CompareTag("Enemy")) 53 { 54 //RaycastHit.distanceは光源から衝突点までのベクトルの大きさを表す 55 Debug.Log(hit.distance); 56 57 //ここでその時回転している時の角度で敵がいるか判別 58 hoge[angleinfo_ray] = (hit.distance / raser_distance_area) - 2.0f; 59 60 rendray.material.SetFloatArray("_FDIST", hoge); 61 } 62 } 63 else 64 { 65 hoge[angleinfo_ray] = 0.0f; 66 rendray.material.SetFloatArray("_FDIST", hoge); 67 } 68 Debug.DrawRay(ray.origin, ray.direction*10, Color.red, 3.0f); 69 } 70} 71

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問