https://qiita.com/krlnmattun/items/77fb612f6290429fc023
Qiitaのこの記事を参照しながらMiniMapScriptを書いていたのですがこの記事のように動作してくれません
一部変更を加えた点は最初に出てくるMiniMap用のScriptがPlayerとなっており何か足りないのかエラーになってしまったのでGameObjectにしました
本当はMiniMapの外にあるアイコンがMapの端で半透明になって欲しいのですがPlayer自身のアイコンが半透明になってしまいます。
Iconを逆にしても上手くいきませんでした
Minimap
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5/// <summary> 6/// MiniMap用のScriptです 7/// </summary> 8public class MiniMap : MonoBehaviour { 9 [SerializeField] private GameObject gameObject; 10 11 void Update () { 12 var pos = gameObject.transform.position; 13 pos.y = transform.position.y; 14 transform.position = pos; 15 } 16}
MiniMapIcon
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[RequireComponent(typeof(SpriteRenderer))] 6public class MinimapIcon : MonoBehaviour { 7 [SerializeField] private Camera minimapCamera; // ミニマップ用カメラ 8 [SerializeField] private Transform iconTarget; // アイコンに対応するオブジェクト(建造物等) 9 [SerializeField] private float rangeRadiusOffset = 1.0f; // 表示範囲のオフセット 10 11 // 必要なコンポーネント 12 private SpriteRenderer spriteRenderer; 13 14 private float minimapRangeRadius; // ミニマップの表示範囲 15 private float defaultPosY; // アイコンのデフォルトY座標 16 const float normalAlpha = 1.0f; // 範囲内のアルファ値 17 const float outRangeAlpha = 0.5f; // 範囲外のアルファ値 18 19 private void Start () { 20 minimapRangeRadius = minimapCamera.orthographicSize; 21 spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); 22 defaultPosY = transform.position.y; 23 } 24 25 private void Update () { 26 DispIcon(); 27 } 28 29 /// <summary> 30 /// アイコン表示を更新する 31 /// </summary> 32 private void DispIcon() { 33 // アイコンを表示する座標 34 var iconPos = new Vector3(iconTarget.position.x, defaultPosY, iconTarget.position.z); 35 36 // ミニマップ範囲内の場合はそのまま表示する 37 if (CheckInsideMap()) { 38 spriteRenderer.color = new Color(spriteRenderer.color.r, spriteRenderer.color.g, spriteRenderer.color.b, normalAlpha); 39 transform.position = iconPos; 40 return; 41 } 42 43 // マップ範囲外の場合、ミニマップ端までのベクトルを求めて半透明で表示する 44 spriteRenderer.color = new Color(spriteRenderer.color.r, spriteRenderer.color.g, spriteRenderer.color.b, outRangeAlpha); 45 var centerPos = new Vector3(minimapCamera.transform.position.x, defaultPosY, minimapCamera.transform.position.z); 46 var offset = iconPos - centerPos; 47 transform.position = centerPos + Vector3.ClampMagnitude(offset, minimapRangeRadius - rangeRadiusOffset); 48 } 49 50 /// <summary> 51 /// オブジェクトがミニマップ範囲内にあるか確認する 52 /// </summary> 53 /// <returns>ミニマップ範囲内の場合、trueを返す</returns> 54 private bool CheckInsideMap() { 55 var cameraPos = minimapCamera.transform.position; 56 var targetPos = iconTarget.position; 57 58 // 直線距離で判定するため、yは0扱いにする 59 cameraPos.y = targetPos.y = 0; 60 61 return Vector3.Distance(cameraPos, targetPos) <= minimapRangeRadius - rangeRadiusOffset; 62 } 63}
「Player」がエラーになってしまったのは、おそらく正常な挙動だろうと思います。Qiitaの記事では言及がないようですが、おそらくPlayerは執筆者の方が独自に作成したプレイヤー制御用スクリプトなんでしょうね。
ご提示のコードのように修正なさったのは、「gameObject」という名称だとMonoBehaviourが元々持っている同名のプロパティと名前かぶりしてしまう点に要注意でしょうが、今回の不具合の直接的な原因ではなさそうに感じます。
記事に従って作成なさったのであれば、ヒエラルキー上のPlayerとObjectそれぞれに子オブジェクトとしてMinimapIconを配置なさっているかと思います。それらのインスペクター上の表示はどのようになっているでしょうか。スクリーンショットをご提示いただければ手がかりになるかもしれません。
色々試していて原因がわかりました!
恐らく私の書いたキャラ移動のScriptに問題がありまして
多分この方が書いたのは見下ろし型のキャラの回転の考慮していないScriptを記述されていて
私が書いたのは三人称視点のScriptなのでキャラの回転を記述しているのが違いだと思います
なのでキャラが反対方向に向くとMapも同じ方に反対方向を向く為Mapとしての機能を果たしてなかったんだと思います。なので見下ろし型のMiniMapのScriptを記述すれば解決すると思います!
あなたの回答
tips
プレビュー