【问题标题】:Checking how lit the player is for a stealth game检查玩家在潜行游戏中的亮度
【发布时间】:2018-06-02 04:10:38
【问题描述】:

所以,我正在构建一个隐形游戏,虽然使用带有相机的阴影缓冲区并获取像素很有效,但它在光线处于特定角度时效果不佳,并且在 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;

    }
}

【问题讨论】:

  • 您能否提供您需要帮助的具体代码行?
  • @user1506104 我没有特定的代码行,因为现有代码不适合,因为它会占用 CPU。我正在寻找更准确的新东西,比如在《小偷 2》或《细胞分裂》游戏中,以确定玩家的光照程度,正如他们在游戏中的测光表上显示的那样。我已经完成了触发器、光线投射和 getpixel,但是它们要么不足,要么太昂贵。我提出了我用来收集问题中的灯光的代码。
  • 我认为这篇文章应该可以帮助您提供多种选择answers.unity.com/questions/24662/…
  • @AdrianSgro 我以前看过那个帖子,我们实际上执行了他们在那里所做的事情。 Volumes 和 Raycasts 不够准确,而且 RenderTexture 在 CPU 上非常昂贵。有人告诉我着色器可以工作,但是,当我一直在研究着色器时,我找不到一个值来告诉我“这就是你的角色的亮度”。 :(

标签: c# unity3d light


【解决方案1】:

我把你的游戏想象成一个有很多黑暗区域的游戏,光源是额外的障碍。我不知道您在谈论触发器时的确切含义,但您可以用碰撞区域覆盖您的照明区域,这可以将玩家与光源的距离计算为可以发送给玩家的照明值。

// 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;
    }
}

【讨论】:

  • 啊,触发器是 Unity 中的碰撞区域。我在我的原型中使用了触发器,虽然可以获得渐变并且很容易放入游戏中,但调整每个触发器的形状在小层面上变成了无休止的苦差事,尤其是对于非常大的房间,所以我想要一些是在播放器本身。有人建议我在着色器中使用某些东西可能会有所帮助。一些值会根据光线照射到对象而改变,但我在 Unity 中没有找到类似的东西。 :(
  • 我也没有在 Unity 中看到过这样的功能。关于 GameObjects 之间交互的主要思维方式在很大程度上依赖于触发器和碰撞(触发器只是没有物理计算的碰撞,这对于这个用例来说是完美的,如果它对你来说不是那么一团糟。我想你正在使用定向主要是灯光?简单地应用一个锥形触发对撞机并检查阴影投射如何?
  • 我实际上在使用聚光灯和点光源。是的,我已经研究了几个月的功能,而我听说的唯一其他选择是着色器。虽然对着色器进行了一些研究,但我没有发现任何可以通过脚本访问的变量来确定有多少光照射到它或颜色如何从最暗变为最亮。我有一些解决方案,但它们对我来说都不是特别令人兴奋的。一种解决方案是让多个触发器/体积具有不同的值,以获得我想要的渐变。
  • 或者,从我在场景中看到的情况来看,着色器在阴影中变得更暗(我从未编写过着色器,请注意我),那么影响对象的变量是什么着色器中的阴影变得更暗(如果它甚至在着色器内部。同样,我不知道)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多