Files
JJBB/Assets/Plugins/NavMeshExtension/Scripts/Editor/PortalManagerEditor.cs
2024-08-23 15:49:34 +08:00

92 lines
3.4 KiB
C#

/* This file is part of the "NavMesh Extension" project by Rebound Games.
* You are only allowed to use these resources if you've bought them directly or indirectly
* from Rebound Games. You shall not license, sublicense, sell, resell, transfer, assign,
* distribute or otherwise make available to any third party the Service or the Content.
*/
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
namespace NavMeshExtension
{
/// <summary>
/// Portal Manager Editor for creating new portal objects.
/// <summary>
[CustomEditor(typeof(PortalManager))]
public class PortalManagerEditor : Editor
{
//manager reference
private PortalManager script;
void OnEnable()
{
script = (PortalManager)target;
}
/// <summary>
/// Custom inspector override for buttons.
/// </summary>
public override void OnInspectorGUI()
{
//create new portal button
if (GUILayout.Button("New Portal"))
{
CreateNewPortal();
}
}
/// <summary>
/// Creates a portal container gameobject with portals as its children.
/// </summary>
public void CreateNewPortal()
{
//get the current unix timestamp for a unique naming scheme
var epochStart = new System.DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc);
string timestamp = (System.DateTime.UtcNow - epochStart).TotalSeconds.ToString("F0");
//create portal container with unique name
GameObject portalGO = new GameObject();
portalGO.transform.parent = script.transform;
portalGO.name = "Portal " + timestamp;
portalGO.AddComponent<PortalObject>();
//try to get a position in the center of our scene view,
//one near position directly at the camera and a position 10 units far away
Camera sceneCam = NavMeshManagerEditor.GetSceneView().camera;
Vector3 camNear = sceneCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0f));
Vector3 camFar = sceneCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 10f));
//calculate direction from near to far position
Vector3 dir = (camFar - camNear).normalized;
//set the portal container to the far position as default
portalGO.transform.position = camFar;
//raycast in the center of the scene view,
//if the ray hits something the portal container gets positioned there
RaycastHit hit;
if (Physics.Raycast(camNear, dir, out hit))
{
portalGO.transform.position = hit.point;
}
//create child objects/portals
for (int i = 0; i < 2; i++)
{
GameObject child = new GameObject("" + i);
child.transform.parent = portalGO.transform;
}
//reposition them around the portal container
portalGO.transform.GetChild(0).position = portalGO.transform.position + Vector3.left;
portalGO.transform.GetChild(1).position = portalGO.transform.position + Vector3.right;
Undo.RegisterCreatedObjectUndo(portalGO, "Created Portal");
Selection.activeGameObject = portalGO;
}
}
}