Некорректно работает OnBecameVisible и ее антоним

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Некорректно работает OnBecameVisible и ее антоним

Сообщение mastersmit 31 окт 2015, 08:03

Суть в том, что нужно включить скрипт, когда го появится в поле зрения камеры. Но го включается еще черт знает где вне зоны видимости камеры.. В сцене камера одна..
Аналогично и наоборот - го скрылся из камеры, но OnBecameInvisible срабатывает, когда го черт знает где уже, а не сразу после выхода из поля зрения камеры..
Так и должно быть и придется искать другие пути решения вопроса?
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Некорректно работает OnBecameVisible и ее антоним

Сообщение GameWorld 31 окт 2015, 08:56

OnBecameInvisible - срабатывает если объект не в камере (не видимый).
OnBecameVisible - срабатывает когда объект в камере (видимый).

http://docs.unity3d.com/ScriptReference/Renderer.OnBecameInvisible.html

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void OnBecameInvisible() {
        enabled = false;
    }
    void OnBecameVisible() {
        enabled = true;
    }
}


Это так же работает для тени от объекта, пока тень видна то и объект виден. Окно Scene является камерой, так что если в игровой камере объект не виден, а окне Сцены - да, то объект виден.
«Улучшение работающего продукта - приводит к его ухудшению.»
Аватара пользователя
GameWorld
Старожил
 
Сообщения: 620
Зарегистрирован: 11 янв 2011, 03:02
Skype: Alien3DModeller

Re: Некорректно работает OnBecameVisible и ее антоним

Сообщение mastersmit 31 окт 2015, 09:22

Да знаю я это. Я даже пробовал сделать билд, чтобы полностью исключить хоть какое-то влияние окна сцены - толку ноль..
В сцене теней нет. Как минимум потому что отбрасывать некуда.
https://youtu.be/x6-y1-RwaeQ
Желтые сферы должны начать стрелять только тогда, когда появятся в поле зрение. И да, начинают, но не тогда, когда непосредственно хоть как-то появятся в камере, а гораздо раньше..
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Некорректно работает OnBecameVisible и ее антоним

Сообщение GameWorld 31 окт 2015, 09:28

Кинь скрипт для сфер.
«Улучшение работающего продукта - приводит к его ухудшению.»
Аватара пользователя
GameWorld
Старожил
 
Сообщения: 620
Зарегистрирован: 11 янв 2011, 03:02
Skype: Alien3DModeller

Re: Некорректно работает OnBecameVisible и ее антоним

Сообщение mastersmit 31 окт 2015, 09:41

Да вот, собственно:
Синтаксис:
Используется csharp
Transform player;
Transform tr;
public int interval;
public int damage;
public GameObject prefab;
float t;

void Start ()
{
    player = GameObject.FindGameObjectWithTag("PlayerParent").transform;
    tr = GetComponent<Transform>();
}

void Update()
{
    if (Time.time > t)
    {
        GameObject bul = Instantiate(prefab, tr.position, Quaternion.LookRotation(player.position - tr.position)) as GameObject;
        bul.GetComponent<BulletEnemy>().damage = damage;
        t = Time.time + interval;
    }
}

void OnBecameVisible()
{
    enabled = true; // включаем скрипт
    GetComponent<Collider>().enabled = true; // включаем коллайдер (на тот случай, когда выстрел игрока залетел за камеру и по каким-то причинам не удалился)
}

void OnBecameInvisible()
{
    Destroy(this.gameObject);
}
 

Итог - скрипт и коллайдер включается, когда до сферы еще черт знает какое расстояние от фрустума камеры..

Аналогично и с Destroy на выстреле и сферах - удаляются не сразу как уйдут за пределы камеры, а через какое-то время..
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Некорректно работает OnBecameVisible и ее антоним

Сообщение GameWorld 31 окт 2015, 10:04

Как вариант, делать проверку на видимость объекта:
http://docs.unity3d.com/ScriptReference/Renderer-isVisible.html
«Улучшение работающего продукта - приводит к его ухудшению.»
Аватара пользователя
GameWorld
Старожил
 
Сообщения: 620
Зарегистрирован: 11 янв 2011, 03:02
Skype: Alien3DModeller

Re: Некорректно работает OnBecameVisible и ее антоним

Сообщение mastersmit 31 окт 2015, 10:22

Вот не поверишь - так тоже делал. Без разницы..
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Некорректно работает OnBecameVisible и ее антоним

Сообщение EagleOwle 31 окт 2015, 14:59

Если не принципиально использовать void OnBecameVisible(), то вот этот код прекрасно справляется с задачей
Синтаксис:
Используется csharp
private Plane[] planes;
private Camera cameraComponent;
private CharacterController characterController;

Vector3 tmpPosition = transform.position;//Запоминаем позицию обьекта, на котором висит этот скрипт
screenPosition = cameraComponent.WorldToScreenPoint(tmpPosition);//Переводим мировые координаты обьекта в экранные
planes = GeometryUtility.CalculateFrustumPlanes(cameraComponent);
 if (GeometryUtility.TestPlanesAABB(planes, characterController.bounds))//Проверяем вошел обьект в зону обзора камеры или нет
 {
 }
else
{
}
 
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: Некорректно работает OnBecameVisible и ее антоним

Сообщение TweeK 23 янв 2020, 10:22

Возможно немного банально, но для срабатывания OnBecameVisible() на объекте на котором висит этот скрипт должен быть какой либо Renderer компонент.
TweeK
UNец
 
Сообщения: 1
Зарегистрирован: 23 янв 2020, 10:20


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 31