Пятница, 15 Ноября 2024, 07:17

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Непонятки с лучами[РЕШЕНО]
MrBILLДата: Понедельник, 23 Сентября 2019, 16:49 | Сообщение # 1
частый гость
Сейчас нет на сайте
День добрый. Знатоки , прошу помощи... С горем пополам реализовал полупрозрачность окружения, которое мешает обзору. Делаю рпг с видом сверху. Я пускаю луч из камеры в игрока, если луч попадает в тег Environment - скрывает его(меняет материал на прозрачный) и наоборот. Работает практически нормально... Иногда получаются баги, если например персонаж идет по прямо на право вдоль 3 деревьев которые плотно находятся друг у друга, соответственно, луч попадает на 1 дерево, а потом НЕ прекращая попадать на тег Environment попадает на 2 дерево, в итоге скрывает 2 , и не ресетает 1 дерево и тд... причем то срабатывает, то нет... Я в замешательстве, кто может помочь ? Заранее благодарю.

Код на Environment:
Код
public class VisibleInvisible : MonoBehaviour
{
    [SerializeField] Material standard;
    [SerializeField] Material invisible;

  
    public void Visible()
    {
        MeshRenderer thisRenderer = GetComponent<MeshRenderer>();
        thisRenderer.material = standard;
    }

    public void Invisible()
    {
        MeshRenderer thisRenderer = GetComponent<MeshRenderer>();
        thisRenderer.material = invisible;
    }
}


И , соответственно код с бросанием луча:
Код
public class HideOtherMaterial : MonoBehaviour
{
    public GameObject prev = null;
    public Camera Maincamera;
    public GameObject player;

    public void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
    }

    

    public void Update()
    {
        RaycastHit hit;
        Ray ray = new Ray(Maincamera.transform.position, player.transform.position - Maincamera.transform.position);
        Debug.DrawRay(Maincamera.transform.position, player.transform.position - Maincamera.transform.position, Color.green);
        if (Physics.Raycast(ray, out hit, 10000))
            {
                GameObject go = hit.collider.gameObject;
                if (go.tag == "Environment")
                {
                    if (prev != hit.collider.gameObject)
                    {
                        go.GetComponent<VisibleInvisible>().Invisible();
                        if (prev != null)
                        {
                            go.GetComponent<VisibleInvisible>().Visible();
                        }
                        prev = hit.collider.gameObject;
                    }              
                }
                else Reset();
            }
            else Reset();
    }

    public void Reset()
    {
        if (prev != null)
        {
            prev.GetComponent<VisibleInvisible>().Visible();
            prev = null;
        }
    }
}


Сообщение отредактировал MrBILL - Вторник, 24 Сентября 2019, 08:21
NavarhДата: Понедельник, 23 Сентября 2019, 17:23 | Сообщение # 2
частый гость
Сейчас нет на сайте
MrBILL, Возможно, надо создать массив объектов, через которые этот луч проходит.
MrBILLДата: Понедельник, 23 Сентября 2019, 22:26 | Сообщение # 3
частый гость
Сейчас нет на сайте
Что то не очень понимаю как... можно по подробнее ?
drcrackДата: Понедельник, 23 Сентября 2019, 23:07 | Сообщение # 4
старожил
Сейчас нет на сайте
Код

go.GetComponent<VisibleInvisible>().Invisible();
                        if (prev != null)
                        {
                            go.GetComponent<VisibleInvisible>().Visible();
                        }

во 2 случае по идее должно быть prev вместо go
MrBILLДата: Вторник, 24 Сентября 2019, 08:19 | Сообщение # 5
частый гость
Сейчас нет на сайте
Цитата drcrack ()
во 2 случае по идее должно быть prev вместо go

Огромное спасибо! Все заработало как нужно.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг