Во-первых, я хочу, чтобы вы поняли мой английский.
Я вручную изменяю проекцию камеры на орфографическую, используя исходный код.
Пожалуйста, обратитесь к коду ниже.
using UnityEngine;
using System.Collections;
public class CameraOrthoController : MonoBehaviour
{
private Matrix4x4 ortho;
private Matrix4x4 perspective;
public float near = 0.001f;
public float far = 1000f;
private float aspect;
public static CameraOrthoController Instance
{
get
{
return instance;
}
set { }
}
//-----------------------------------------------------
private static CameraOrthoController instance = null;
//---------------------------------------------------
// Use this for initialization
void Awake()
{
if (instance)
{
DestroyImmediate(gameObject);
return;
}
// 이 인스턴스를 유효한 유일 오브젝트로 만든다
instance = this;
}
private void Start()
{
perspective = Camera.main.projectionMatrix;
}
public void StartMatrixBlender(float OrthoSize)
{
aspect = (Screen.width + 0.0f) / (Screen.height + 0.0f);
if (OrthoSize != 0f)
{
float vertical = OrthoSize;
float horizontal = (vertical * 16f) / 9f;
ortho = Matrix4x4.Ortho(-horizontal, horizontal, -vertical, vertical, near, far);
BlendToMatrix(ortho, 1f);
}
else
{
BlendToMatrix(perspective, 1f);
}
}
//---------------------------------------
private Matrix4x4 MatrixLerp(Matrix4x4 from, Matrix4x4 to, float time)
{
Matrix4x4 ret = new Matrix4x4();
int i;
for (i = 0; i < 16; i++)
ret[i] = Mathf.Lerp(from[i], to[i], time);
return ret;
}
IEnumerator LerpFromTo(Matrix4x4 src, Matrix4x4 dest, float duration)
{
float startTime = Time.time;
while (Time.time - startTime < duration)
{
Camera.main.projectionMatrix = MatrixLerp(src, dest, (Time.time - startTime) / duration);
yield return new WaitForSeconds(0f);
}
Camera.main.projectionMatrix = dest;
}
//-------------------------------------------------
private Coroutine BlendToMatrix(Matrix4x4 targetMatrix, float duration)
{
StopAllCoroutines();
return StartCoroutine(LerpFromTo(Camera.main.projectionMatrix, targetMatrix, duration));
}
//-------------------------------------------------
public void OnEvent(EVENT_TYPE Event_Type, Component Sender, object Param = null, object Param2 = null)
{
switch (Event_Type)
{
}
}
}
Я использую код таким образом.
CameraOrthoController.Instance.StartMatrixBlender(OrthographicSize);
До сих пор это работало хорошо.
Однако проблема возникла, когда я добавил систему частиц для эффекта.
Экран, на котором возникает проблема
В обычном состоянии эффект появляется перед игровым объектом, как показано на экране сцены в нижней части рисунка выше.
Но если я использую код, который я написал выше, для управления камерой, эффект всегда будет скрыт всеми объектами игры, как если бы это было на экране игры в верхней части изображения. Несмотря на то, что эффекты расположены перед игровым объектом.
Сначала я подумал, что можно было бы решить это с помощью сортировки слоев, но я не думаю, что это проблема со слоем, потому что она видна в нормальных условиях камеры.
Я хочу знать, в чем проблема с вышеуказанными кодами, потому что я должен их использовать.
Пожалуйста, дайте мне знать, если вы знаете, как решить это.
Спасибо.