First commit

This commit is contained in:
Alexander Filippov
2021-06-27 14:46:18 +02:00
parent dcd4fbca11
commit fe555652c3
32 changed files with 794 additions and 0 deletions

View File

@ -0,0 +1,13 @@
{
"name": "Agoxandr.Utils",
"references": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 80ed647da8ce73c45b66c239eba0365a
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

24
Runtime/Array.cs Normal file
View File

@ -0,0 +1,24 @@
using System;
namespace Agoxandr.Utils
{
public static class Array
{
public static T[] Append<T>(this T[] array, T item)
{
if (array == null)
{
return new T[] { item };
}
T[] result = new T[array.Length + 1];
for (int i = 0; i < array.Length; i++)
{
result[i] = array[i];
}
result[array.Length] = item;
return result;
}
}
}

11
Runtime/Array.cs.meta Normal file
View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6e14f8172d2e1b345bd36b974bcaeb61
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,34 @@
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace Agoxandr.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

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: eb81e1373aff45646b4be5eaacc2d20f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,34 @@
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace Agoxandr.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

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cf2664ad6bca36847b220c7a796fda2f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

46
Runtime/EventManager.cs Normal file
View File

@ -0,0 +1,46 @@
using UnityEngine;
namespace Agoxandr.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 int UpdateLength()
{
return (int)OnUpdated?.GetInvocationList().Length;
}
public int FixedUpdateLength()
{
return (int)OnFixedUpdated?.GetInvocationList().Length;
}
public int LateUpdateLength()
{
return (int)OnLateUpdated?.GetInvocationList().Length;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0bb08af31d5be794d8b065613bf63318
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 01070f8d70b500f46bbff0be7295d435
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,5 @@
using UnityEngine;
namespace Agoxandr.Utils
{
public class ReadOnlyFieldAttribute : PropertyAttribute { }
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 49159ec7b8dcf764485aa5b141808651
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,107 @@
using System.Diagnostics;
using UnityEngine;
namespace Agoxandr.Utils
{
public class ReflectionProbeVolume : MonoBehaviour
{
[Min(1)]
public int resolution = 4;
public float offset = 2;
[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

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a740d05cae346654fbd4dc576e6405ab
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

36
Runtime/TimeSince.cs Normal file
View File

@ -0,0 +1,36 @@
// https://garry.tv/timesince
//TimeSince ts;
//void Start()
//{
// ts = 0;
//}
//void Update()
//{
// if (ts > 10)
// {
// DoSomethingAfterTenSeconds();
// }
//}
using UnityEngine;
namespace Agoxandr.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 };
}
}
}

11
Runtime/TimeSince.cs.meta Normal file
View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8969b6c0535a0984f95d376c95506953
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: