BadCats
@BadCats

Trying to get a relatively sized RenderBuffer without an active camera — в Unity?

В дополнение к моему предыдущему вопросу: -Проблема с Instantiate -ом на в Unity? - в котором я при создании нового объекта имитирующего зеркало из заданного класса - столкнулся с проблемой что при таком "генерировании объекта на лету" с помощью Instantiate - RenderTexture - остается одна на все объекты, и поэтому нужен метод для расчета возврата на каждый создаваемый объект новой текстуры - т.е генерировать текстуру нужо было также "на лету " в классе отвечающий за объект который я собирался проинстанцировать. Т.е вызывая Instantate и передавая в качестве параметра для создания экземпляр класса для создания "зеркала" - в самом классе я должен был использовать метод RenderTexture.GetTemporary() - для расчета необходимой текстуры для рендеренга.

MCamera.targetTexture= RenderTexture.GetTemporary(System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[0])),
            System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[0])), 
            System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[2])));

В качестве аргумента для RenderTexture.GetTemporary
я передаю возвращаемое значение моего метода
RecalculateRenderTexture(Move.herTransorm.position)[0])
- по индексам [0],[1],[2] - т.к метод возвращает несколько значений , а "множественного" return -кроме yield -(что мне в данном случае не подходит)- поэтому возвращаю массив.
Вот примерно так:
float[] return_Array = new float[3];
        
        return_Array[0] = whidth_Texture;
        return_Array[1] = heigth_Texture;
        return_Array[2] = dethBuffer;
        return return_Array;
- т.е в самом методе происходит расчет текстуры для инстанцируемого зеркала и затем эти данные возвращаются и переедаются в качестве аргумента для RenderTexture.GetTemporary
В чем проблема: когда я возвращаю из
RecalculateRenderTexture(Move.herTransorm.position)[2])
- по индексу 2 значение RenderBuffer - которое у меня заданно как int dethBuffer = 0; - т.е по идее также для каждого объекта будет возвращаться свое значение - свой 0 или любое другое число (числа я также пробовал разные).
У меня при этом возникает ошибка:
rying to get a relatively sized RenderBuffer without an active camera
-т.е попытка установить RenderBuffer - без активной камеры.
Но при этом в самом классе поле камеры есть:
public class MirrorS : MonoBehaviour {
    public Camera MCamera;

- в которую я и подвязываю созданную текстуру, но ошибка остается
MCamera.targetTexture= RenderTexture.GetTemporary(System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[0])),
            System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[0])), 
            System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[2])));

При этом на сцене начинает творится "вакханалия" - при создании объекта основная камера(под основной я имею ввиду ту которая прикреплена к персонажу) начинает "конкурировать" с камерой только что созданного объекта - попеременно ежесекундно сменяя друг -друга - т.е только что созданная камера с рендер текстурой не прикрепилась к только что созданному объекту (типа - Cancas) - и пытается рендерется поверх основной камеры.
И в дополнение кр всему выше сказанному - привожу полный код класса отвечающего за зеркало. Может так легче будет разобраться в проблеме.
public class MirrorS : MonoBehaviour {
    public Camera MCamera;
   
   
    // Use this for initialization
    void Start () {
		
	}

    // Update is called once per frame
    void Awake()
    {
  
      
     

    }

    private void Update()
    {
        int k = 0;
         MCamera.targetTexture= RenderTexture.GetTemporary(System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[0])),
            System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[0])), 
            System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[2])));
    }

    private void OnBecameInvisible()
    {
        MCamera.enabled = false;
    }
    private void OnBecameVisible()
    {
        MCamera.enabled = true;
    }

    public float[] RecalculateRenderTexture(Vector3 pos)
       
    {   bool IsCos = true;
        float DeltaX = Move.herTransorm.position.x*Time.deltaTime - Move.herTransorm.position.x;
        float PersonHeight = Move.herTransorm.transform.lossyScale.y;
        Vector3 LookFor_B = new Vector3(Move.LOOK,0,0);
        float sinB=0;
        float heigth_Texture = 0;
        float angle_T=0;// тскомый угол при основании
        float cosB = PersonHeight / DeltaX;
        float angle_Y = Mathf.Sin(cosB);// считаем по теореме синусов
         //  heigth_Texture / angle_Y == (PersonHeight / 2) / sinB;
         //heigth_Texture / angle_Y == 2/ PersonHeight*sinB
        heigth_Texture = 2 * angle_Y / PersonHeight * sinB;
        if (cosB==0)
        {
            sinB = 1;
        }
        else if(cosB == 0 && IsCos==true && sinB==1)
            
        {
            sinB = PersonHeight / DeltaX;
           angle_T  = Mathf.Cos(sinB);// считаем по теореме косинусов 
            heigth_Texture = Mathf.Sqrt(Mathf.Pow(PersonHeight, 2) + Mathf.Pow(DeltaX, 2) - 2 * PersonHeight * DeltaX * angle_T);

        }
       
        int whidth_Texture = 0;
        int dethBuffer = 0;

       // particleSystemEmiter.P.position
        float[] return_Array = new float[3];
        
        return_Array[0] = whidth_Texture;
        return_Array[1] = heigth_Texture;
        return_Array[2] = dethBuffer;
        return return_Array; 
            
    }
}
  • Вопрос задан
  • 659 просмотров
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
что там за вакханалия - это еще вопрос конечно..может у вас у камеры для зеркала тоже тэг MainCamera стоит??

а так у вас же вроде ошибка сама за себя говорит..
Trying to get a relatively sized RenderBuffer without an active camera
private void OnBecameInvisible()
    {
        MCamera.enabled = false;
    }

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

ну и так бонусом гляньте вот сюда
https://msdn.microsoft.com/ru-ru/library/system.tu...
вам чтоб не array возвращать поидее более чем сгодиться. и не будет этих некрасивых
System.Convert.ToInt32((RecalculateRenderTexture(Move.herTransorm.position)[0])

и вообще так к слову..зачем вы сделали массив из float если на деле все конвертируете в int??

да и вы понимаете что три раза вызываете метод??
float[] tempArray = RecalculateRenderTexture(Move.herTransorm.position);
Camera.targetTexture= RenderTexture.GetTemporary(
            System.Convert.ToInt32(tempArray [0])),
            System.Convert.ToInt32(tempArray [0])), 
            System.Convert.ToInt32(tempArray [2])));


Хотя бы так. просто для читаемости.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы