ゲーム開発の概要 - Unity で選択したビジュアル インジケーターを実装する
ゲーム オブジェクトがフォーカスされているかどうかを表示および示すロジックを作成するには、レンダラー境界を使用する必要があります。私の ARPG では、風のタクト ゲームのように、ターゲット オブジェクトがフォーカスされているかどうかを示すインジケーターを作成したいと思います。結果は以下のようになります。
以上が最終的な効果です
シェーダーについては、ビルボードが実装された新しいシェーダーグラフを作成しました。前の記事では、シェーダーグラフでビルボードを作成する方法について説明しました。次に、テクスチャとして、2 つの回転した正方形を使用して矢状点を作成し、サイン関数を使用して UV 位置をオフセットしました。
次に、ビジュアル要素自体を設定するコントローラーを作成しました。これはターゲット オブジェクトの上に設定する必要があるため、ターゲット オブジェクトのレンダラー オブジェクトを使用し、その境界を使用してターゲットの位置を取得することが最善です。これを行うには、オブジェクトの境界 (ベクトル 3) の中心を取得し、このベクトル 3 の y 要素 (高さ) をオブジェクトの境界の最大 y 値に置き換えます。次に、クワッド上でレンダリングしているため、クワッドをターゲット オブジェクトの上に浮かせるために、クワッドのローカル サイズの半分を追加する必要があります。
ここで必要なのは、コントローラーにロジックを追加して、VisualSelectionController を有効にして SetToTarget を呼び出すことだけです。
注: オブジェクトの階層の最上位にレンダラーがあるとは限らないため、ここでは GetComponentInChildren を使用します。
using UnityEngine;
public class VisualSelectionController : MonoBehaviour
{
[SerializeField]
private Renderer _mRenderer = null;
private void Awake()
{
if (_mRenderer == null)
{
_mRenderer = GetComponent<Renderer>();
}
}
private void OnEnable()
{
_mRenderer.enabled = true;
}
private void OnDisable()
{
_mRenderer.enabled = false;
}
public void SetToTarget(Transform targetObject)
{
transform.parent = targetObject;
// 尝试获取渲染器并将位置设置为边界的顶部
Renderer targetRenderer = null;
targetRenderer = targetObject.GetComponentInChildren<Renderer>(false);
//mTargetObject.TryGetComponent<Renderer>(out targetRenderer);
if (targetRenderer == null)
{
Debug.Log("No renderer found");
} else
{
Vector3 tempPos = targetRenderer.bounds.center;
tempPos.y = targetRenderer.bounds.max.y + transform.localScale.y * 0.5f;
transform.position = tempPos;
}
}
}