В дополнение к моему предыдущему вопросу: -
Проблема с 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;
}
}