Files
beyond/Assets/Scripts/Portal.cs
2024-11-20 15:21:28 +01:00

100 lines
3.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace Beyond {
[RequireComponent(typeof(Renderer))]
[ExecuteInEditMode]
public class Portal : MonoBehaviour
{
public Portal secondPortal;
public Camera camera;
private Renderer renderer;
private Camera mainCamera;
public enum PortalType { PORTAL_A, PORTAL_B };
public PortalType portalType = PortalType.PORTAL_A;
private RenderTexture rt;
private Material mat;
private bool isEnabled = false;
private GameObject player;
public bool useMainCamera = false;
private void Awake()
{
mainCamera = Camera.main;
if (camera)
{
rt = new RenderTexture(512, 512, 16, RenderTextureFormat.ARGB32);
rt.Create();
camera.targetTexture = rt;
}
}
// Start is called before the first frame update
void Start()
{
renderer = GetComponent<Renderer>();
mat = renderer.material;
mat.SetTexture("_BaseMap", secondPortal.camera.targetTexture);
player = GameObject.FindGameObjectWithTag("Player");
}
private void InitPortals()
{
secondPortal.portalType = (PortalType)((int)(portalType + 1) % 2);
if (camera == null)
{
camera = GameObject.Instantiate<Camera>(mainCamera, this.transform);
}
}
// Update is called once per frame
void Update()
{
#if UNITY_EDITOR
if (!EditorApplication.isPlaying)
{
if (secondPortal)
{
if (secondPortal.portalType == portalType)
{
InitPortals();
}
}
}
#endif
if (Application.isPlaying)
isEnabled = (player.transform.position - transform.position).magnitude < 10f;
else
{
isEnabled = false;
}
if (isEnabled)
{
secondPortal.camera.enabled = true;
if (useMainCamera)
{
camera.transform.position = mainCamera.transform.position;
camera.transform.rotation = mainCamera.transform.rotation;
}
secondPortal.camera.transform.localPosition = camera.transform.localPosition;
secondPortal.camera.transform.localRotation = camera.transform.localRotation;
//secondPortal.camera.transform.localPosition = transform.InverseTransformPoint(mainCamera.transform.position);
//secondPortal.camera.transform.localRotation = Quaternion.Inverse(transform.rotation) * mainCamera.transform.rotation;
}
else
{
secondPortal.camera.enabled = false;
}
}
}
}