游戏开发小结——在Unity中实现选中可视指示器

创建逻辑以显示指示游戏对象是否处于聚焦状态,需要使用渲染器边界。在我的ARPG中,我想创建一个指示器,以显示目标对象是否处于聚焦状态,就像在Wind Waker游戏中一样,您可以在下面看到结果。
在这里插入图片描述

以上是最终效果

对于着色器,我创建了一个新的shadergraph,其中实现了billboarding:在之前的文章中,我谈到了如何在shadergraph中创建billboard。然后对于纹理,我使用了两个旋转的正方形来创建一个矢尖,并使用正弦函数偏移了UV位置。
然后,我创建了一个控制器来设置可视元素本身。它需要被设置在目标对象之上,因此最好是使用目标对象的渲染器对象并使用其边界来获取目标位置。为此,我们获取对象的边界中心(vector 3),然后将这个vector 3的y元素(高度the height)替换为对象边界的最大y值。然后,由于我们在quad上进行渲染,我们需要添加quad本地尺寸的一半以将quad浮动在目标对象上方。
现在您只需要在控制器中添加一些逻辑来启用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;

        }
    }
}
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐