Проверка того, насколько горит игрок для стелс-игры - PullRequest
0 голосов
/ 02 июня 2018

Итак, я создаю стелс-игру, и хотя использование теневого буфера с камерой и получение пикселей сработало, оно не очень эффективно при освещении под определенными углами и чрезвычайно дорого в Unity.Я ищу способ определить, насколько освещен плеер через шейдер, однако я не программист и никогда не касался шейдеров.Я искал несколько месяцев, но я не нашел значения, и все просто используют триггеры, которые не действуют в этой игре.Я пытаюсь сделать что-то похожее на игры Thief2 или Splinter Cell.Я знаю о радиопередачах, однако они также недостаточно точны.

Итак, как я могу определить, насколько горит игрок, чтобы получить соответствующий градиент?

Вот код, который я использую для сбора света.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShadowBufferScript : MonoBehaviour {

    public RenderTexture shadowBuffer;
    Texture2D tex2d;
    public float percentageHidden;
    public float relativeLuminance;

    void Start()
    {   
        tex2d = new Texture2D (shadowBuffer.width, shadowBuffer.height, TextureFormat.RGB24, false);
    }


    void FixedUpdate () 
    {
        tex2d = new Texture2D (shadowBuffer.width, shadowBuffer.height, TextureFormat.RGB24, false);
        RenderTexture.active = shadowBuffer;
        tex2d.ReadPixels (new Rect (0, 0, shadowBuffer.width, shadowBuffer.height), 0, 0);  
        tex2d.Apply ();

        Color shadowBufferColor = tex2d.GetPixel (0, 0);
        relativeLuminance = shadowBufferColor.r * 0.2126f + shadowBufferColor.g * 0.7152f + shadowBufferColor.b * 0.0722f;

        percentageHidden = relativeLuminance * 100;

    }
}

1 Ответ

0 голосов
/ 02 июня 2018

Я представляю вашу игру с множеством темных областей с источниками света в качестве дополнительных препятствий.Я не знаю точно, что вы имеете в виду, когда говорите о триггерах, но вы могли бы покрыть свои освещенные области зонами столкновения, которые могли бы рассчитать расстояние игрока от источника света до значения освещения, которое можно было бы отправить игроку.

// Collision functions based on correct layering (Player/LightingZones)
[RequireComponent(typeof(Collider))]
public class LightingCalculator : MonoBehaviour
{
    private bool _entered = false;

    private void Update()
    {
        if (_entered) FindObjectOfType<PlayerController>().LightingValue = CalculateLighting();
    }

    private void OnCollisionEnter(Collision col)
    {
        _entered = true;
    }

    private void OnCollisionExit(Collision col)
    {
        _entered = false;
    }

    private float CalculateLighting()
    {
        float lighting = 0;
        // Your calculation
        return lighting;
    }
}
...