Resumen del desarrollo del juego: implementación de un indicador visual seleccionado en Unity

Resumen del desarrollo del juego: implementación de un indicador visual seleccionado en Unity

Crear lógica para mostrar e indicar si un objeto del juego está enfocado requiere el uso de límites de renderizado. En mi ARPG quiero crear un indicador que muestre si el objeto objetivo está enfocado, como en el juego Wind Waker, puedes ver el resultado a continuación.
Insertar descripción de la imagen aquí

Lo anterior es el efecto final.

Para el sombreador, creé un nuevo gráfico de sombreado en el que se implementó la valla publicitaria: en un artículo anterior, hablé sobre cómo crear una valla publicitaria en un gráfico de sombreado. Luego, para la textura, utilicé dos cuadrados rotados para crear un punto sagital y compensar las posiciones UV usando una función sinusoidal.
Luego creé un controlador para configurar el elemento visual en sí. Debe configurarse encima del objeto de destino, por lo que es mejor usar el objeto de representación del objeto de destino y usar sus límites para obtener la posición de destino. Para hacer esto, obtenemos el centro de los límites del objeto (vector 3) y luego reemplazamos el elemento y de este vector 3 (la altura) con el valor y máximo de los límites del objeto. Luego, dado que estamos renderizando en un quad, necesitamos agregar la mitad de las dimensiones locales del quad para que el quad flote sobre el objeto de destino.
Ahora solo necesita agregar algo de lógica en su controlador para habilitar VisualSelectionController y llamar a SetToTarget.
Tenga en cuenta: utilizamos GetComponentInChildren aquí porque el objeto no necesariamente tiene su procesador en la parte superior de su jerarquía.

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;

        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_37270421/article/details/130003146
Recomendado
Clasificación