Linux migration.

This commit is contained in:
Alexander Filippov 2022-05-20 22:58:25 +02:00
parent 029e02fd2f
commit 14bbae67e5
16 changed files with 698 additions and 698 deletions

View File

@ -1,38 +1,38 @@
using UnityEditor;
using UnityEngine;
namespace Utils
{
[CustomEditor(typeof(EventManager), true)]
public class EventManagerEditor : Editor
{
public override void OnInspectorGUI()
{
var eventManager = (EventManager)target;
GUILayout.BeginHorizontal();
GUILayout.Label("Update");
if (Application.isPlaying)
{
GUILayout.FlexibleSpace();
GUILayout.Label(EventManager.UpdateLength.ToString());
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("FixedUpdate");
if (Application.isPlaying)
{
GUILayout.FlexibleSpace();
GUILayout.Label(EventManager.FixedUpdateLength.ToString());
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("LateUpdate");
if (Application.isPlaying)
{
GUILayout.FlexibleSpace();
GUILayout.Label(EventManager.LateUpdateLength.ToString());
}
GUILayout.EndHorizontal();
}
}
}
using UnityEditor;
using UnityEngine;
namespace Utils
{
[CustomEditor(typeof(EventManager), true)]
public class EventManagerEditor : Editor
{
public override void OnInspectorGUI()
{
var eventManager = (EventManager)target;
GUILayout.BeginHorizontal();
GUILayout.Label("Update");
if (Application.isPlaying)
{
GUILayout.FlexibleSpace();
GUILayout.Label(EventManager.UpdateLength.ToString());
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("FixedUpdate");
if (Application.isPlaying)
{
GUILayout.FlexibleSpace();
GUILayout.Label(EventManager.FixedUpdateLength.ToString());
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("LateUpdate");
if (Application.isPlaying)
{
GUILayout.FlexibleSpace();
GUILayout.Label(EventManager.LateUpdateLength.ToString());
}
GUILayout.EndHorizontal();
}
}
}

View File

@ -1,51 +1,51 @@
using System.IO;
using UnityEditor;
using UnityEngine;
namespace Utils
{
public class PackgeUpdater
{
private static string ManifestPath
{
get
{
var projectPath = Directory.GetParent(Application.dataPath).FullName;
var manifestPath = Path.Combine(projectPath, "Packages", "manifest.json");
return manifestPath;
}
}
public static string GetIdentifier(string input, char charFrom, char charTo)
{
var first = input.IndexOf(charFrom);
var second = input.IndexOf(charTo, first + 1);
var posFrom = input.IndexOf(charFrom, second + 1);
if (posFrom != -1) //if found char
{
var posTo = input.IndexOf(charTo, posFrom + 1);
if (posTo != -1) //if found char
{
return input.Substring(posFrom + 1, posTo - posFrom - 1);
}
}
return string.Empty;
}
[MenuItem("Assets/Update Git Packages", false, 1000)]
private static void UpdateGitPackages()
{
var lines = File.ReadAllLines(ManifestPath);
foreach (var line in lines)
{
if (line.Contains("git"))
{
var identifier = GetIdentifier(line, '"', '"');
Debug.Log("Checking for updates " + identifier);
UnityEditor.PackageManager.Client.Add(identifier);
}
}
}
}
}
using System.IO;
using UnityEditor;
using UnityEngine;
namespace Utils
{
public class PackgeUpdater
{
private static string ManifestPath
{
get
{
var projectPath = Directory.GetParent(Application.dataPath).FullName;
var manifestPath = Path.Combine(projectPath, "Packages", "manifest.json");
return manifestPath;
}
}
public static string GetIdentifier(string input, char charFrom, char charTo)
{
var first = input.IndexOf(charFrom);
var second = input.IndexOf(charTo, first + 1);
var posFrom = input.IndexOf(charFrom, second + 1);
if (posFrom != -1) //if found char
{
var posTo = input.IndexOf(charTo, posFrom + 1);
if (posTo != -1) //if found char
{
return input.Substring(posFrom + 1, posTo - posFrom - 1);
}
}
return string.Empty;
}
[MenuItem("Assets/Update Git Packages", false, 1000)]
private static void UpdateGitPackages()
{
var lines = File.ReadAllLines(ManifestPath);
foreach (var line in lines)
{
if (line.Contains("git"))
{
var identifier = GetIdentifier(line, '"', '"');
Debug.Log("Checking for updates " + identifier);
UnityEditor.PackageManager.Client.Add(identifier);
}
}
}
}
}

View File

@ -1,16 +1,16 @@
using UnityEditor;
using UnityEngine;
namespace Utils
{
[CustomPropertyDrawer(typeof(ReadOnlyFieldAttribute))]
public class ReadOnlyFieldDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GUI.enabled = false;
EditorGUI.PropertyField(position, property, label, true);
GUI.enabled = true;
}
}
}
using UnityEditor;
using UnityEngine;
namespace Utils
{
[CustomPropertyDrawer(typeof(ReadOnlyFieldAttribute))]
public class ReadOnlyFieldDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GUI.enabled = false;
EditorGUI.PropertyField(position, property, label, true);
GUI.enabled = true;
}
}
}

View File

@ -1,168 +1,168 @@
using UnityEditor;
using UnityEngine;
namespace Utils
{
public class ReflectionProbeVolumeEditor : MonoBehaviour
{
[CustomEditor(typeof(ReflectionProbeVolume), true)]
public class EventManagerEditor : Editor
{
private SerializedProperty resolution;
private SerializedProperty offset;
private SerializedProperty threshold;
private SerializedProperty blendDistance;
private void OnEnable()
{
resolution = serializedObject.FindProperty("resolution");
offset = serializedObject.FindProperty("offset");
threshold = serializedObject.FindProperty("threshold");
blendDistance = serializedObject.FindProperty("blendDistance");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(resolution);
EditorGUILayout.PropertyField(offset);
EditorGUILayout.PropertyField(threshold);
EditorGUILayout.PropertyField(blendDistance);
serializedObject.ApplyModifiedProperties();
EditorGUILayout.Space();
if (GUILayout.Button("Place"))
{
Place();
}
}
private void Place()
{
var voxelSize = resolution.intValue;
var offset = this.offset.floatValue;
var threshold = this.threshold.floatValue;
var blendDistance = this.blendDistance.floatValue;
ReflectionProbeVolume reflectionProbeVolume = (ReflectionProbeVolume)target;
var transform = reflectionProbeVolume.transform;
//Gizmos.DrawWireCube(transform.position, transform.localScale);
var startPos = transform.position + transform.right * transform.localScale.x / 2 + transform.up * transform.localScale.y / 2 + transform.forward * transform.localScale.z / 2;
var xVar = transform.localScale.x / voxelSize / 2f;
var zVar = transform.localScale.z / voxelSize / 2f;
var data = new Vector3[voxelSize, voxelSize];
//Gizmos.color = Color.blue;
for (int x = 0; x < voxelSize; x++)
{
for (int z = 0; z < voxelSize; z++)
{
var rayPos = startPos - transform.right * xVar - transform.forward * zVar;
if (Physics.Raycast(rayPos, Vector2.down, out RaycastHit hit))
{
var point = hit.point + Vector3.up * offset;
data[x, z] = point;
}
zVar += transform.localScale.z / voxelSize;
}
xVar += transform.localScale.x / voxelSize;
zVar = transform.localScale.z / voxelSize / 2f;
}
CheckSquare(data, 5, voxelSize, threshold, blendDistance, transform);
CheckSquare(data, 4, voxelSize, threshold, blendDistance, transform);
CheckSquare(data, 3, voxelSize, threshold, blendDistance, transform);
CheckSquare(data, 2, voxelSize, threshold, blendDistance, transform);
for (int x = 0; x < voxelSize; x++)
{
for (int z = 0; z < voxelSize; z++)
{
if (data[x, z].x != float.PositiveInfinity)
{
var go = new GameObject("Reflection Probe Size: 1");
go.transform.SetParent(transform);
go.transform.position = data[x, z];
var reflectionProbe = go.AddComponent(typeof(ReflectionProbe)) as ReflectionProbe;
reflectionProbe.resolution = 16;
reflectionProbe.center = new Vector3(0f, transform.position.y - data[x, z].y, 0f);
reflectionProbe.size = new Vector3(transform.localScale.x / voxelSize + blendDistance, transform.localScale.y, transform.localScale.z / voxelSize + blendDistance);
}
}
}
}
private void CheckSquare(Vector3[,] data, int size, int voxelSize, float threshold, float blendDistance, Transform transform)
{
for (int x = 0; x < voxelSize; x++)
{
for (int z = 0; z < voxelSize; z++)
{
if (x + size <= voxelSize && z + size <= voxelSize)
{
bool valid = true;
var point = Vector3.zero;
for (int i = 0; i < size; i++)
{
for (int k = 0; k < size; k++)
{
var pos = data[x + i, z + k];
if (pos != Vector3.positiveInfinity)
{
if (Compare(data[x, z].y, pos.y, threshold))
{
point += pos;
}
else
{
valid = false;
}
}
}
}
if (valid)
{
point /= size * size;
var go = new GameObject("Reflection Probe Size: " + size);
go.transform.SetParent(transform);
go.transform.position = point;
var reflectionProbe = go.AddComponent(typeof(ReflectionProbe)) as ReflectionProbe;
if (size == 2)
{
reflectionProbe.resolution = 16;
}
else if (size == 3)
{
reflectionProbe.resolution = 32;
}
else if (size == 4)
{
reflectionProbe.resolution = 32;
}
else if (size == 5)
{
reflectionProbe.resolution = 64;
}
reflectionProbe.center = new Vector3(0f, transform.position.y - point.y, 0f);
reflectionProbe.size = new Vector3(transform.localScale.x / voxelSize * size + blendDistance, transform.localScale.y, transform.localScale.z / voxelSize * size + blendDistance);
for (int i = 0; i < size; i++)
{
for (int k = 0; k < size; k++)
{
data[x + i, z + k] = Vector3.positiveInfinity;
}
}
}
}
}
}
}
private bool Compare(float arg0, float arg1, float threshold)
{
return Mathf.Abs(arg0 - arg1) < threshold;
}
}
}
}
using UnityEditor;
using UnityEngine;
namespace Utils
{
public class ReflectionProbeVolumeEditor : MonoBehaviour
{
[CustomEditor(typeof(ReflectionProbeVolume), true)]
public class EventManagerEditor : Editor
{
private SerializedProperty resolution;
private SerializedProperty offset;
private SerializedProperty threshold;
private SerializedProperty blendDistance;
private void OnEnable()
{
resolution = serializedObject.FindProperty("resolution");
offset = serializedObject.FindProperty("offset");
threshold = serializedObject.FindProperty("threshold");
blendDistance = serializedObject.FindProperty("blendDistance");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(resolution);
EditorGUILayout.PropertyField(offset);
EditorGUILayout.PropertyField(threshold);
EditorGUILayout.PropertyField(blendDistance);
serializedObject.ApplyModifiedProperties();
EditorGUILayout.Space();
if (GUILayout.Button("Place"))
{
Place();
}
}
private void Place()
{
var voxelSize = resolution.intValue;
var offset = this.offset.floatValue;
var threshold = this.threshold.floatValue;
var blendDistance = this.blendDistance.floatValue;
ReflectionProbeVolume reflectionProbeVolume = (ReflectionProbeVolume)target;
var transform = reflectionProbeVolume.transform;
//Gizmos.DrawWireCube(transform.position, transform.localScale);
var startPos = transform.position + transform.right * transform.localScale.x / 2 + transform.up * transform.localScale.y / 2 + transform.forward * transform.localScale.z / 2;
var xVar = transform.localScale.x / voxelSize / 2f;
var zVar = transform.localScale.z / voxelSize / 2f;
var data = new Vector3[voxelSize, voxelSize];
//Gizmos.color = Color.blue;
for (int x = 0; x < voxelSize; x++)
{
for (int z = 0; z < voxelSize; z++)
{
var rayPos = startPos - transform.right * xVar - transform.forward * zVar;
if (Physics.Raycast(rayPos, Vector2.down, out RaycastHit hit))
{
var point = hit.point + Vector3.up * offset;
data[x, z] = point;
}
zVar += transform.localScale.z / voxelSize;
}
xVar += transform.localScale.x / voxelSize;
zVar = transform.localScale.z / voxelSize / 2f;
}
CheckSquare(data, 5, voxelSize, threshold, blendDistance, transform);
CheckSquare(data, 4, voxelSize, threshold, blendDistance, transform);
CheckSquare(data, 3, voxelSize, threshold, blendDistance, transform);
CheckSquare(data, 2, voxelSize, threshold, blendDistance, transform);
for (int x = 0; x < voxelSize; x++)
{
for (int z = 0; z < voxelSize; z++)
{
if (data[x, z].x != float.PositiveInfinity)
{
var go = new GameObject("Reflection Probe Size: 1");
go.transform.SetParent(transform);
go.transform.position = data[x, z];
var reflectionProbe = go.AddComponent(typeof(ReflectionProbe)) as ReflectionProbe;
reflectionProbe.resolution = 16;
reflectionProbe.center = new Vector3(0f, transform.position.y - data[x, z].y, 0f);
reflectionProbe.size = new Vector3(transform.localScale.x / voxelSize + blendDistance, transform.localScale.y, transform.localScale.z / voxelSize + blendDistance);
}
}
}
}
private void CheckSquare(Vector3[,] data, int size, int voxelSize, float threshold, float blendDistance, Transform transform)
{
for (int x = 0; x < voxelSize; x++)
{
for (int z = 0; z < voxelSize; z++)
{
if (x + size <= voxelSize && z + size <= voxelSize)
{
bool valid = true;
var point = Vector3.zero;
for (int i = 0; i < size; i++)
{
for (int k = 0; k < size; k++)
{
var pos = data[x + i, z + k];
if (pos != Vector3.positiveInfinity)
{
if (Compare(data[x, z].y, pos.y, threshold))
{
point += pos;
}
else
{
valid = false;
}
}
}
}
if (valid)
{
point /= size * size;
var go = new GameObject("Reflection Probe Size: " + size);
go.transform.SetParent(transform);
go.transform.position = point;
var reflectionProbe = go.AddComponent(typeof(ReflectionProbe)) as ReflectionProbe;
if (size == 2)
{
reflectionProbe.resolution = 16;
}
else if (size == 3)
{
reflectionProbe.resolution = 32;
}
else if (size == 4)
{
reflectionProbe.resolution = 32;
}
else if (size == 5)
{
reflectionProbe.resolution = 64;
}
reflectionProbe.center = new Vector3(0f, transform.position.y - point.y, 0f);
reflectionProbe.size = new Vector3(transform.localScale.x / voxelSize * size + blendDistance, transform.localScale.y, transform.localScale.z / voxelSize * size + blendDistance);
for (int i = 0; i < size; i++)
{
for (int k = 0; k < size; k++)
{
data[x + i, z + k] = Vector3.positiveInfinity;
}
}
}
}
}
}
}
private bool Compare(float arg0, float arg1, float threshold)
{
return Mathf.Abs(arg0 - arg1) < threshold;
}
}
}
}

View File

@ -1,81 +1,81 @@
using UnityEditor;
using UnityEngine;
namespace Utils
{
[InitializeOnLoad]
public static class SceneViewRotation
{
private static bool toggleDir;
static SceneViewRotation()
{
SceneView.duringSceneGui += OnSceneGUI;
}
private static void OnSceneGUI(SceneView sceneView)
{
if (sceneView.isRotationLocked)
{
return;
}
Event e = Event.current;
switch (e.type)
{
case EventType.KeyDown:
if (e.keyCode == KeyCode.Keypad1)
{
sceneView.rotation = Quaternion.LookRotation(toggleDir ? Vector3.forward : Vector3.back);
}
else if (e.keyCode == KeyCode.Keypad2)
{
var angles = sceneView.rotation.eulerAngles;
sceneView.rotation = Quaternion.Euler(angles.x - 15f, angles.y, angles.z);
}
else if (e.keyCode == KeyCode.Keypad3)
{
sceneView.rotation = Quaternion.LookRotation(toggleDir ? Vector3.left : Vector3.right);
}
else if (e.keyCode == KeyCode.Keypad4)
{
var angles = sceneView.rotation.eulerAngles;
sceneView.rotation = Quaternion.Euler(angles.x, angles.y + 15f, angles.z);
}
else if (e.keyCode == KeyCode.Keypad5)
{
sceneView.orthographic = !sceneView.orthographic;
}
else if (e.keyCode == KeyCode.Keypad6)
{
var angles = sceneView.rotation.eulerAngles;
sceneView.rotation = Quaternion.Euler(angles.x, angles.y - 15f, angles.z);
}
else if (e.keyCode == KeyCode.Keypad7)
{
sceneView.rotation = new Quaternion(0f, toggleDir ? -.7f : .7f, -.7f, 0f);
}
else if (e.keyCode == KeyCode.Keypad8)
{
var angles = sceneView.rotation.eulerAngles;
sceneView.rotation = Quaternion.Euler(angles.x + 15f, angles.y, angles.z);
}
//else if (e.keyCode == KeyCode.Keypad9)
//{
// //sceneView.rotation = Quaternion.LookRotation(-sceneView.camera.transform.forward);
// sceneView.rotation = Quaternion.Inverse(sceneView.rotation);
//}
else if (e.keyCode == KeyCode.LeftControl)
{
toggleDir = true;
}
break;
case EventType.KeyUp:
if (e.keyCode == KeyCode.LeftControl)
{
toggleDir = false;
}
break;
}
}
}
}
using UnityEditor;
using UnityEngine;
namespace Utils
{
[InitializeOnLoad]
public static class SceneViewRotation
{
private static bool toggleDir;
static SceneViewRotation()
{
SceneView.duringSceneGui += OnSceneGUI;
}
private static void OnSceneGUI(SceneView sceneView)
{
if (sceneView.isRotationLocked)
{
return;
}
Event e = Event.current;
switch (e.type)
{
case EventType.KeyDown:
if (e.keyCode == KeyCode.Keypad1)
{
sceneView.rotation = Quaternion.LookRotation(toggleDir ? Vector3.forward : Vector3.back);
}
else if (e.keyCode == KeyCode.Keypad2)
{
var angles = sceneView.rotation.eulerAngles;
sceneView.rotation = Quaternion.Euler(angles.x - 15f, angles.y, angles.z);
}
else if (e.keyCode == KeyCode.Keypad3)
{
sceneView.rotation = Quaternion.LookRotation(toggleDir ? Vector3.left : Vector3.right);
}
else if (e.keyCode == KeyCode.Keypad4)
{
var angles = sceneView.rotation.eulerAngles;
sceneView.rotation = Quaternion.Euler(angles.x, angles.y + 15f, angles.z);
}
else if (e.keyCode == KeyCode.Keypad5)
{
sceneView.orthographic = !sceneView.orthographic;
}
else if (e.keyCode == KeyCode.Keypad6)
{
var angles = sceneView.rotation.eulerAngles;
sceneView.rotation = Quaternion.Euler(angles.x, angles.y - 15f, angles.z);
}
else if (e.keyCode == KeyCode.Keypad7)
{
sceneView.rotation = new Quaternion(0f, toggleDir ? -.7f : .7f, -.7f, 0f);
}
else if (e.keyCode == KeyCode.Keypad8)
{
var angles = sceneView.rotation.eulerAngles;
sceneView.rotation = Quaternion.Euler(angles.x + 15f, angles.y, angles.z);
}
//else if (e.keyCode == KeyCode.Keypad9)
//{
// //sceneView.rotation = Quaternion.LookRotation(-sceneView.camera.transform.forward);
// sceneView.rotation = Quaternion.Inverse(sceneView.rotation);
//}
else if (e.keyCode == KeyCode.LeftControl)
{
toggleDir = true;
}
break;
case EventType.KeyUp:
if (e.keyCode == KeyCode.LeftControl)
{
toggleDir = false;
}
break;
}
}
}
}

View File

@ -1,21 +1,21 @@
MIT License
Copyright (c) 2021 Alexander Filippov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
MIT License
Copyright (c) 2021 Alexander Filippov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,13 +1,13 @@
# Utils
Unity package with utility useful for almost any project.
## Features
* Hide the script field.
* C# Event based Event Manager
* Call Update, FixedUpdate and LateUpdate from anywhere.
* Better performance than Unity methods.
* Automatic volume based reflection probe placer.
* Check how much time has passed with the Time Since struct.
* Camera Blender controls in the scene view.
* Package Manager Git updater.
# Utils
Unity package with utility useful for almost any project.
## Features
* Hide the script field.
* C# Event based Event Manager
* Call Update, FixedUpdate and LateUpdate from anywhere.
* Better performance than Unity methods.
* Automatic volume based reflection probe placer.
* Check how much time has passed with the Time Since struct.
* Camera Blender controls in the scene view.
* Package Manager Git updater.
* Append to an array.

View File

@ -1,22 +1,22 @@
namespace Utils
{
public static class ArrayExtensions
{
public static T[] Append<T>(this T[] array, T item)
{
if (array == null)
{
return new T[] { item };
}
var result = new T[array.Length + 1];
for (var i = 0; i < array.Length; i++)
{
result[i] = array[i];
}
result[array.Length] = item;
return result;
}
}
}
namespace Utils
{
public static class ArrayExtensions
{
public static T[] Append<T>(this T[] array, T item)
{
if (array == null)
{
return new T[] { item };
}
var result = new T[array.Length + 1];
for (var i = 0; i < array.Length; i++)
{
result[i] = array[i];
}
result[array.Length] = item;
return result;
}
}
}

View File

@ -1,36 +1,36 @@
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace Utils
{
[CustomEditor(typeof(MonoBehaviour), true)]
public class DefaultMonoBehaviourEditor : Editor
{
private bool hideScriptField;
private void OnEnable()
{
hideScriptField = target.GetType().GetCustomAttributes(typeof(HideScriptField), false).Length > 0;
}
public override void OnInspectorGUI()
{
if (hideScriptField)
{
serializedObject.Update();
EditorGUI.BeginChangeCheck();
DrawPropertiesExcluding(serializedObject, "m_Script");
if (EditorGUI.EndChangeCheck())
{
serializedObject.ApplyModifiedProperties();
}
}
else
{
base.OnInspectorGUI();
}
}
}
}
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace Utils
{
[CustomEditor(typeof(MonoBehaviour), true)]
public class DefaultMonoBehaviourEditor : Editor
{
private bool hideScriptField;
private void OnEnable()
{
hideScriptField = target.GetType().GetCustomAttributes(typeof(HideScriptField), false).Length > 0;
}
public override void OnInspectorGUI()
{
if (hideScriptField)
{
serializedObject.Update();
EditorGUI.BeginChangeCheck();
DrawPropertiesExcluding(serializedObject, "m_Script");
if (EditorGUI.EndChangeCheck())
{
serializedObject.ApplyModifiedProperties();
}
}
else
{
base.OnInspectorGUI();
}
}
}
}
#endif

View File

@ -1,34 +1,34 @@
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace Utils
{
[CustomEditor(typeof(ScriptableObject), true)]
public class DefaultScriptableObjectEditor : Editor
{
private bool hideScriptField;
private void OnEnable()
{
hideScriptField = target.GetType().GetCustomAttributes(typeof(HideScriptField), false).Length > 0;
}
public override void OnInspectorGUI()
{
if (hideScriptField)
{
serializedObject.Update();
EditorGUI.BeginChangeCheck();
DrawPropertiesExcluding(serializedObject, "m_Script");
if (EditorGUI.EndChangeCheck())
serializedObject.ApplyModifiedProperties();
}
else
{
base.OnInspectorGUI();
}
}
}
}
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace Utils
{
[CustomEditor(typeof(ScriptableObject), true)]
public class DefaultScriptableObjectEditor : Editor
{
private bool hideScriptField;
private void OnEnable()
{
hideScriptField = target.GetType().GetCustomAttributes(typeof(HideScriptField), false).Length > 0;
}
public override void OnInspectorGUI()
{
if (hideScriptField)
{
serializedObject.Update();
EditorGUI.BeginChangeCheck();
DrawPropertiesExcluding(serializedObject, "m_Script");
if (EditorGUI.EndChangeCheck())
serializedObject.ApplyModifiedProperties();
}
else
{
base.OnInspectorGUI();
}
}
}
}
#endif

View File

@ -1,58 +1,58 @@
using UnityEngine;
namespace Utils
{
public class EventManager : MonoBehaviour
{
public delegate void UpdateAction();
public static event UpdateAction OnUpdated;
public delegate void FixedUpdateAction();
public static event FixedUpdateAction OnFixedUpdated;
public delegate void LateUpdateAction();
public static event LateUpdateAction OnLateUpdated;
private void Update()
{
OnUpdated?.Invoke();
}
private void FixedUpdate()
{
OnFixedUpdated?.Invoke();
}
private void LateUpdate()
{
OnLateUpdated?.Invoke();
}
public static int UpdateLength
{
get
{
var list = OnUpdated?.GetInvocationList();
return list?.Length ?? 0;
}
}
public static int FixedUpdateLength
{
get
{
var list = OnFixedUpdated?.GetInvocationList();
return list?.Length ?? 0;
}
}
public static int LateUpdateLength
{
get
{
var list = OnLateUpdated?.GetInvocationList();
return list?.Length ?? 0;
}
}
}
}
using UnityEngine;
namespace Utils
{
public class EventManager : MonoBehaviour
{
public delegate void UpdateAction();
public static event UpdateAction OnUpdated;
public delegate void FixedUpdateAction();
public static event FixedUpdateAction OnFixedUpdated;
public delegate void LateUpdateAction();
public static event LateUpdateAction OnLateUpdated;
private void Update()
{
OnUpdated?.Invoke();
}
private void FixedUpdate()
{
OnFixedUpdated?.Invoke();
}
private void LateUpdate()
{
OnLateUpdated?.Invoke();
}
public static int UpdateLength
{
get
{
var list = OnUpdated?.GetInvocationList();
return list?.Length ?? 0;
}
}
public static int FixedUpdateLength
{
get
{
var list = OnFixedUpdated?.GetInvocationList();
return list?.Length ?? 0;
}
}
public static int LateUpdateLength
{
get
{
var list = OnLateUpdated?.GetInvocationList();
return list?.Length ?? 0;
}
}
}
}

View File

@ -1,7 +1,7 @@
using System;
namespace Utils
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class HideScriptField : Attribute { }
using System;
namespace Utils
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class HideScriptField : Attribute { }
}

View File

@ -1,6 +1,6 @@
using UnityEngine;
namespace Utils
{
public class ReadOnlyFieldAttribute : PropertyAttribute { }
}
using UnityEngine;
namespace Utils
{
public class ReadOnlyFieldAttribute : PropertyAttribute { }
}

View File

@ -1,108 +1,108 @@
using System.Diagnostics;
using UnityEngine;
namespace Utils
{
public class ReflectionProbeVolume : MonoBehaviour
{
[Min(1)]
public int resolution = 4;
public float offset = 2;
public float blendDistance = 1;
[Min(0)]
public float threshold = .5f;
[Conditional("UNITY_EDITOR")]
private void OnDrawGizmosSelected()
{
Gizmos.DrawWireCube(transform.position, transform.localScale);
var startPos = transform.position + transform.right * transform.localScale.x / 2 + transform.up * transform.localScale.y / 2 + transform.forward * transform.localScale.z / 2;
var xVar = transform.localScale.x / resolution / 2f;
var zVar = transform.localScale.z / resolution / 2f;
var data = new Vector3[resolution, resolution];
Gizmos.color = Color.blue;
for (int x = 0; x < resolution; x++)
{
for (int z = 0; z < resolution; z++)
{
var rayPos = startPos - transform.right * xVar - transform.forward * zVar;
if (Physics.Raycast(rayPos, Vector2.down, out RaycastHit hit))
{
var point = hit.point + Vector3.up * offset;
data[x, z] = point;
}
zVar += transform.localScale.z / resolution;
}
xVar += transform.localScale.x / resolution;
zVar = transform.localScale.z / resolution / 2f;
}
CheckSquare(data, 5);
CheckSquare(data, 4);
CheckSquare(data, 3);
CheckSquare(data, 2);
for (int x = 0; x < resolution; x++)
{
for (int z = 0; z < resolution; z++)
{
if (data[x, z] != Vector3.positiveInfinity)
{
Gizmos.DrawSphere(data[x, z], .1f);
}
}
}
}
private void CheckSquare(Vector3[,] data, int size)
{
for (int x = 0; x < resolution; x++)
{
for (int z = 0; z < resolution; z++)
{
if (x + size <= resolution && z + size <= resolution)
{
bool valid = true;
var point = Vector3.zero;
for (int i = 0; i < size; i++)
{
for (int k = 0; k < size; k++)
{
var pos = data[x + i, z + k];
if (pos != Vector3.positiveInfinity)
{
if (Compare(data[x, z].y, pos.y))
{
point += pos;
}
else
{
valid = false;
}
}
}
}
if (valid)
{
point /= size * size;
Gizmos.DrawSphere(point, size * .1f);
for (int i = 0; i < size; i++)
{
for (int k = 0; k < size; k++)
{
data[x + i, z + k] = Vector3.positiveInfinity;
}
}
}
}
}
}
}
private bool Compare(float arg0, float arg1)
{
return Mathf.Abs(arg0 - arg1) < threshold;
}
}
}
using System.Diagnostics;
using UnityEngine;
namespace Utils
{
public class ReflectionProbeVolume : MonoBehaviour
{
[Min(1)]
public int resolution = 4;
public float offset = 2;
public float blendDistance = 1;
[Min(0)]
public float threshold = .5f;
[Conditional("UNITY_EDITOR")]
private void OnDrawGizmosSelected()
{
Gizmos.DrawWireCube(transform.position, transform.localScale);
var startPos = transform.position + transform.right * transform.localScale.x / 2 + transform.up * transform.localScale.y / 2 + transform.forward * transform.localScale.z / 2;
var xVar = transform.localScale.x / resolution / 2f;
var zVar = transform.localScale.z / resolution / 2f;
var data = new Vector3[resolution, resolution];
Gizmos.color = Color.blue;
for (int x = 0; x < resolution; x++)
{
for (int z = 0; z < resolution; z++)
{
var rayPos = startPos - transform.right * xVar - transform.forward * zVar;
if (Physics.Raycast(rayPos, Vector2.down, out RaycastHit hit))
{
var point = hit.point + Vector3.up * offset;
data[x, z] = point;
}
zVar += transform.localScale.z / resolution;
}
xVar += transform.localScale.x / resolution;
zVar = transform.localScale.z / resolution / 2f;
}
CheckSquare(data, 5);
CheckSquare(data, 4);
CheckSquare(data, 3);
CheckSquare(data, 2);
for (int x = 0; x < resolution; x++)
{
for (int z = 0; z < resolution; z++)
{
if (data[x, z] != Vector3.positiveInfinity)
{
Gizmos.DrawSphere(data[x, z], .1f);
}
}
}
}
private void CheckSquare(Vector3[,] data, int size)
{
for (int x = 0; x < resolution; x++)
{
for (int z = 0; z < resolution; z++)
{
if (x + size <= resolution && z + size <= resolution)
{
bool valid = true;
var point = Vector3.zero;
for (int i = 0; i < size; i++)
{
for (int k = 0; k < size; k++)
{
var pos = data[x + i, z + k];
if (pos != Vector3.positiveInfinity)
{
if (Compare(data[x, z].y, pos.y))
{
point += pos;
}
else
{
valid = false;
}
}
}
}
if (valid)
{
point /= size * size;
Gizmos.DrawSphere(point, size * .1f);
for (int i = 0; i < size; i++)
{
for (int k = 0; k < size; k++)
{
data[x + i, z + k] = Vector3.positiveInfinity;
}
}
}
}
}
}
}
private bool Compare(float arg0, float arg1)
{
return Mathf.Abs(arg0 - arg1) < threshold;
}
}
}

View File

@ -1,36 +1,36 @@
using UnityEngine;
namespace Utils
{
public struct TimeSince
{
private float time;
public static implicit operator float(TimeSince ts)
{
return Time.time - ts.time;
}
public static implicit operator TimeSince(float ts)
{
return new TimeSince { time = Time.time - ts };
}
}
}
// https://garry.tv/timesince
//TimeSince ts;
//void Start()
//{
// ts = 0;
//}
//void Update()
//{
// if (ts > 10)
// {
// DoSomethingAfterTenSeconds();
// }
//}
using UnityEngine;
namespace Utils
{
public struct TimeSince
{
private float time;
public static implicit operator float(TimeSince ts)
{
return Time.time - ts.time;
}
public static implicit operator TimeSince(float ts)
{
return new TimeSince { time = Time.time - ts };
}
}
}
// https://garry.tv/timesince
//TimeSince ts;
//void Start()
//{
// ts = 0;
//}
//void Update()
//{
// if (ts > 10)
// {
// DoSomethingAfterTenSeconds();
// }
//}

View File

@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: 3cea9973e4f0f814ea87aacbfbddcb7a
PackageManifestImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 3cea9973e4f0f814ea87aacbfbddcb7a
PackageManifestImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: