E_ElecCompetition/Electrical_inspectionCompet.../Assets/Plugins/HighlightingSystemDemo/Scripts/Helpers/CompoundObjectController.cs

165 lines
4.1 KiB
C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using HighlightingSystem;
namespace HighlightingSystem.Demo
{
public class CompoundObjectController : MonoBehaviour
{
static private readonly GUIContent labelAddObject = new GUIContent("Add Object");
static private readonly GUIContent labelRemoveObject = new GUIContent("Remove Object");
static private readonly GUIContent labelChangeMaterial = new GUIContent("Change Material");
static private readonly GUIContent labelChangeShader = new GUIContent("Change Shader");
// Reference to meshes and shaders
public Mesh[] meshes;
public Shader[] shaders;
// Cached transform component
private Transform tr;
// Cached list of child objects
private List<GameObject> objects;
private int shaderIndex = 0;
private Highlighter h;
#region MonoBehaviour
//
void OnEnable()
{
UIManager.Register(DrawGUI, 5);
}
//
void OnDisable()
{
UIManager.Unregister(DrawGUI);
}
//
void Start()
{
tr = GetComponent<Transform>();
objects = new List<GameObject>();
h = GetComponent<Highlighter>();
}
#endregion
#region Public Methods
//
public void DrawGUI()
{
Camera cam = Camera.main;
Vector3 anchor = cam.WorldToScreenPoint(transform.position + new Vector3(0f, 0f, -3f));
if (anchor.z < 0f) { return; }
var style = UI.skin.button;
var size = style.CalcSize(labelAddObject);
size = Vector2.Max(size, style.CalcSize(labelRemoveObject));
size = Vector2.Max(size, style.CalcSize(labelChangeMaterial));
size = Vector2.Max(size, style.CalcSize(labelChangeShader));
size.x += 40f;
size.y = 30f;
Rect position = new Rect(anchor.x, anchor.y, size.x, size.y);
// Center
position.x -= 0.5f * size.x;
position.y += 0.5f * (4f * size.y + 3f * UI.spacing.y);
//
position.y = Screen.height - position.y;
if (UI.Button(position, labelAddObject)) { AddObject(); }
position.y += size.y + UI.spacing.y;
if (UI.Button(position, labelRemoveObject)) { RemoveObject(); }
position.y += size.y + UI.spacing.y;
if (UI.Button(position, labelChangeMaterial)) { ChangeMaterial(); }
position.y += size.y + UI.spacing.y;
if (UI.Button(position, labelChangeShader)) { ChangeShader(); }
}
#endregion
#region Private Methods
//
private void AddObject()
{
Mesh m = meshes[Random.Range(0, meshes.Length)];
GameObject o = new GameObject("SubObject");
MeshFilter mf = o.AddComponent<MeshFilter>();
mf.mesh = m;
MeshCollider mc = o.AddComponent<MeshCollider>();
mc.sharedMesh = m;
MeshRenderer mr = o.AddComponent<MeshRenderer>();
mr.material = new Material(shaders[0]);
Transform t = o.GetComponent<Transform>();
t.parent = tr;
t.localPosition = Random.insideUnitSphere * 2f;
objects.Add(o);
// Reinitialize highlighting materials, because child objects have changed
h.SetDirty();
}
//
private void ChangeMaterial()
{
if (objects.Count < 1) { AddObject(); }
shaderIndex++;
if (shaderIndex >= shaders.Length) { shaderIndex = 0; }
Shader shader = shaders[shaderIndex];
foreach (GameObject obj in objects)
{
Renderer renderer = obj.GetComponent<Renderer>();
renderer.material = new Material(shader);
}
// Reinitialize highlightable materials, because material(s) have changed
h.SetDirty();
}
//
private void ChangeShader()
{
if (objects.Count < 1) { AddObject(); }
shaderIndex++;
if (shaderIndex >= shaders.Length) { shaderIndex = 0; }
Shader shader = shaders[shaderIndex];
foreach (GameObject obj in objects)
{
Renderer renderer = obj.GetComponent<Renderer>();
renderer.material.shader = shader;
}
// Reinitialize highlightable materials, because shader(s) have changed
h.SetDirty();
}
//
private void RemoveObject()
{
if (objects.Count < 1) { return; }
GameObject toRemove = objects[objects.Count - 1];
objects.Remove(toRemove);
Destroy(toRemove);
// Reinitialize highlighting materials, because child objects have changed
h.SetDirty();
}
#endregion
}
}