FIrst Real Commit

Code refactor and migration to github.
This commit is contained in:
TextusGames 2020-05-16 16:17:04 +03:00
parent 6ec9a5e5f0
commit 0581978db8
72 changed files with 1089 additions and 154 deletions

8
Assets/TextusGames.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 88ad9386d88d6dd4b901fe96a8c2dcc4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 45856e53c605df64baf0e89751741df7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f549199d6eac96943ae073e003f12aa3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1388bc43afa1f4e41ba1032dcee62b04
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,101 @@
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
public static class SerializeReferenceGenericSelectionMenu
{
/// Purpose.
/// This is generic selection menu.
/// Filtering.
/// You can add substring filter here to filter by search string.
/// As well ass type or interface restrictions.
/// As well as any custom restriction that is based on input type.
/// And it will be performed on each Appropriate type found by TypeCache.
public static void ShowContextMenuForManagedReference(this SerializedProperty property, IEnumerable<Func<Type,bool>> filters = null)
{
var context = new GenericMenu();
FillContextMenu(filters, context, property);
context.ShowAsContext();
}
private static void FillContextMenu(IEnumerable<Func<Type, bool>> enumerableFilters, GenericMenu contextMenu, SerializedProperty property)
{
var filters = enumerableFilters.ToList();// Prevents possible multiple enumerations
// Adds "Make Null" menu command
contextMenu.AddItem(new GUIContent("Null"), false, () => MakeSerializedPropertyNull(property));
// Find real type of managed reference
var realPropertyType = SerializeReferenceTypeNameUtility.GetRealTypeFromTypename(property.managedReferenceFieldTypename);
if (realPropertyType == null)
{
Debug.LogError("Can not get type from");
return;
}
// Get and filter all appropriate types
var types = TypeCache.GetTypesDerivedFrom(realPropertyType);
foreach (var type in types)
{
// Skips unity engine Objects (because they are not serialized by SerializeReference)
if(type.IsSubclassOf(typeof(UnityEngine.Object)))
continue;
// Skip abstract classes because they should not be instantiated
if(type.IsAbstract)
continue;
// Filter types by provided filters if there is ones
if (FilterTypeByFilters(filters, type) == false)
continue;
AddItemToContextMenu(type, contextMenu, property);
}
}
private static void MakeSerializedPropertyNull(SerializedProperty serializedProperty)
{
serializedProperty.serializedObject.Update();
serializedProperty.managedReferenceValue = null;
serializedProperty.serializedObject.ApplyModifiedPropertiesWithoutUndo(); // undo is bugged for now
}
private static void AddItemToContextMenu(Type type, GenericMenu genericMenuContext, SerializedProperty property)
{
var assemblyName = type.Assembly.ToString().Split('(', ',')[0];
var entryName = type + " ( " + assemblyName + " )";
genericMenuContext.AddItem(new GUIContent(entryName), false, AssignNewInstanceOfType, new AssignInstanceGenericMenuParameter(type, property));
}
private static void AssignNewInstanceOfType(object objectGenericMenuParameter )
{
var parameter = (AssignInstanceGenericMenuParameter) objectGenericMenuParameter;
var type = parameter.Type;
var property = parameter.Property;
var instance = Activator.CreateInstance(type);
property.serializedObject.Update();
property.managedReferenceValue = instance;
property.serializedObject.ApplyModifiedPropertiesWithoutUndo(); // undo is bugged for now
}
private static bool FilterTypeByFilters (IEnumerable<Func<Type,bool>> filters, Type type) =>
filters.All(f => f == null || f.Invoke(type));
private readonly struct AssignInstanceGenericMenuParameter
{
public AssignInstanceGenericMenuParameter(Type type, SerializedProperty property)
{
Type = type;
Property = property;
}
public readonly SerializedProperty Property;
public readonly Type Type;
}
}
#endif

View File

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

View File

@ -0,0 +1,23 @@
using System;
/// This utility exists, because serialize reference managed reference typename returns combined string
/// and not data class that contains separate strings for assembly name and for class name (and possibly namespace name)
public static class SerializeReferenceTypeNameUtility
{
public static Type GetRealTypeFromTypename(string stringType)
{
var names = GetSplitNamesFromTypename(stringType);
var realType = Type.GetType($"{names.ClassName}, {names.AssemblyName}");
return realType;
}
public static (string AssemblyName, string ClassName) GetSplitNamesFromTypename(string typename)
{
if (string.IsNullOrEmpty(typename))
return ("","");
var typeSplitString = typename.Split(char.Parse(" "));
var typeClassName = typeSplitString[1];
var typeAssemblyName = typeSplitString[0];
return (typeAssemblyName, typeClassName);
}
}

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4a5d0da55302d3d418d5afe408a9a916
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 827f3a2847b39a94eb6fcbdb0d73d6ca
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
using System;
using UnityEngine;
[AttributeUsage(AttributeTargets.Field)]
public class SerializeReferenceButtonAttribute : PropertyAttribute
{
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c64e0f68b41b48939c9b98cc29a19b20
timeCreated: 1579584059

View File

@ -0,0 +1,31 @@
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
[CustomPropertyDrawer(typeof(SerializeReferenceButtonAttribute))]
public class SerializeReferenceButtonAttributeDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, true);
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);
var labelPosition = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight);
EditorGUI.LabelField(labelPosition, label);
var typeRestrictions = SerializedReferenceUIBuiltInTypeRestrictions.GetAllBuiltInTypeRestrictions(fieldInfo);
property.DrawSelectionButtonForManagedReference(position, typeRestrictions);
EditorGUI.PropertyField(position, property, GUIContent.none, true);
EditorGUI.EndProperty();
}
}
#endif

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5a07638044724309b6088c28a11a15af
timeCreated: 1579584059

View File

@ -0,0 +1,45 @@
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public static class SerializeReferenceInspectorButton
{
public static readonly Color SerializedReferenceMenuBackgroundColor = new Color(0.1f, 0.55f, 0.9f, 1f);
/// Must be drawn before DefaultProperty in order to receive input
public static void DrawSelectionButtonForManagedReference(this SerializedProperty property, Rect position, IEnumerable<Func<Type, bool>> filters = null) =>
property.DrawSelectionButtonForManagedReference(position, SerializedReferenceMenuBackgroundColor, filters);
/// Must be drawn before DefaultProperty in order to receive input
public static void DrawSelectionButtonForManagedReference(this SerializedProperty property,
Rect position, Color color, IEnumerable<Func<Type, bool>> filters = null)
{
var backgroundColor = color;
var buttonPosition = position;
buttonPosition.x += EditorGUIUtility.labelWidth + 1 * EditorGUIUtility.standardVerticalSpacing;
buttonPosition.width = position.width - EditorGUIUtility.labelWidth - 1 * EditorGUIUtility.standardVerticalSpacing;
buttonPosition.height = EditorGUIUtility.singleLineHeight;
var storedIndent = EditorGUI.indentLevel;
EditorGUI.indentLevel = 0;
var storedColor = GUI.backgroundColor;
GUI.backgroundColor = backgroundColor;
var names = SerializeReferenceTypeNameUtility.GetSplitNamesFromTypename(property.managedReferenceFullTypename);
var className = string.IsNullOrEmpty(names.ClassName) ? "Null (Assign)" : names.ClassName;
var assemblyName = names.AssemblyName;
if (GUI.Button(buttonPosition, new GUIContent(className, className + " ( "+ assemblyName +" )" )))
property.ShowContextMenuForManagedReference(filters);
GUI.backgroundColor = storedColor;
EditorGUI.indentLevel = storedIndent;
}
}
#endif

View File

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

View File

@ -0,0 +1,21 @@
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public static class SerializeReferenceInspectorMiddleMouseMenu
{
public static void ShowContextMenuForManagedReferenceOnMouseMiddleButton(this SerializedProperty property,
Rect position, IEnumerable<Func<Type, bool>> filters = null)
{
var e = Event.current;
if (e.type != EventType.MouseDown || !position.Contains(e.mousePosition) || e.button != 2)
return;
property.ShowContextMenuForManagedReference(filters);
}
}
#endif

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ff8136ca43f822642adfa6388b137133
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
using System;
using UnityEngine;
[AttributeUsage(AttributeTargets.Field)]
public class SerializeReferenceMenuAttribute : PropertyAttribute
{
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4f1c372fa681cf146973df30a0d969fd
timeCreated: 1579584059

View File

@ -0,0 +1,26 @@
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
[CustomPropertyDrawer(typeof(SerializeReferenceMenuAttribute))]
public class SerializeReferenceMenuAttributeDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, true);
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);
var typeRestrictions = SerializedReferenceUIBuiltInTypeRestrictions.GetAllBuiltInTypeRestrictions(fieldInfo);
property.ShowContextMenuForManagedReferenceOnMouseMiddleButton(position, typeRestrictions);
EditorGUI.PropertyField(position, property, true);
EditorGUI.EndProperty();
}
}
#endif

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: eaa31b1c39ee9424abe12fa0034d9d1b
timeCreated: 1579584059

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f124bd3bbd4e5e44882fcc7ca4bbfd89
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c99b932d88d36e9439bb3e944b823502
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,3 @@
{
"name": "AmimalWorld"
}

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b4a0269d5bc8b7345b6e2b1160c596db
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,42 @@
using System;
using UnityEngine;
[Serializable]
public class AnimalBase : IAnimal
{
[SerializeField] protected float age;
public GameObject food;
public virtual void Feed()
{
Debug.Log("Thanks");
}
}
[Serializable]
public class AnimalChild : AnimalBase {}
[Serializable]
public abstract class AnimalGrandChildAbstract : AnimalBase
{
public string someString;
}
[Serializable]
public class AbstractAnimalGrandChild : AnimalGrandChildAbstract {}
[Serializable]
public abstract class AbstractAnimal : IAnimal
{
[SerializeField] protected float age;
public GameObject food;
public virtual void Feed()
{
Debug.Log("Thanks");
}
}
[Serializable]
public class AbstractAnimalChild : AbstractAnimal {}

View File

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

View File

@ -0,0 +1,4 @@
public interface IAnimal
{
void Feed();
}

View File

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

View File

@ -0,0 +1,7 @@
using System;
[Serializable]
public abstract class MammalBase : AnimalBase
{
public int numberOfBones;
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b7dae106e8c3cf94198d8c1d0e9bce89
timeCreated: 1579584059

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 05ba0cd389296cf44af17c4e8362fb75
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 375e18944bf750b45b54b9715b23432a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d16251d523e3f02469f6ce9d3adef548
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,30 @@

public abstract class ApeBase : MammalBase, IApe
{
public string Tag = default;
}
public interface IApe
{
}
public class RedApe : ApeBase
{
}
public class GoldenApe : ApeBase
{
}
public class GreenApe : ApeBase
{
}
public class BlackApe : ApeBase
{
}

View File

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

View File

@ -0,0 +1,30 @@

public abstract class CatBase : MammalBase, ICat
{
public string Tag = default;
}
public interface ICat
{
}
public class RedCat : CatBase
{
}
public class GoldenCat : CatBase
{
}
public class GreenCat : CatBase
{
}
public class BlackCat : CatBase
{
}

View File

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

View File

@ -0,0 +1,30 @@

public abstract class DogBase : MammalBase, IDog
{
public string Tag = default;
}
public interface IDog
{
}
public class RedDog : DogBase
{
}
public class GoldenDog : DogBase
{
}
public class GreenDog : DogBase
{
}
public class BlackDog : DogBase
{
}

View File

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

View File

@ -0,0 +1,28 @@
public abstract class FishBase : AnimalBase, IFish
{
public string Tag = default;
}
public interface IFish
{
}
public class RedFish : FishBase
{
}
public class GoldenFish : FishBase
{
}
public class GreenFish : FishBase
{
}
public class BlackFish : FishBase
{
}

View File

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

View File

@ -0,0 +1,30 @@

public abstract class InsectBase : AnimalBase, IInsect
{
public string Tag = default;
}
public interface IInsect
{
}
public class RedInsect : InsectBase
{
}
public class GoldenInsect : InsectBase
{
}
public class GreenInsect : InsectBase
{
}
public class BlackInsect : InsectBase
{
}

View File

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

View File

@ -0,0 +1,16 @@
{
"name": "SerializedReferenceExample",
"references": [
"GUID:6b7100eb7c609e2418517e5c25caaf2a",
"GUID:73106583b323919458c1e05166706ce3"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fe686aa525f35e14498d533b056e962b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: e8e69356eab680c4dbe3066647b5dd77 guid: 32f0237ba42624e46ac3f3ffe9234032
folderAsset: yes folderAsset: yes
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}

View File

@ -0,0 +1,62 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!850595691 &4890085278179872738
LightingSettings:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SampleSceneSettings
serializedVersion: 2
m_GIWorkflowMode: 1
m_EnableBakedLightmaps: 0
m_EnableRealtimeLightmaps: 0
m_RealtimeEnvironmentLighting: 1
m_BounceScale: 1
m_AlbedoBoost: 1
m_UsingShadowmask: 1
m_BakeBackend: 0
m_LightmapMaxSize: 1024
m_BakeResolution: 40
m_Padding: 2
m_TextureCompression: 1
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAO: 0
m_MixedBakeMode: 2
m_LightmapsBakeMode: 1
m_FilterMode: 1
m_LightmapParameters: {fileID: 0}
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_RealtimeResolution: 2
m_ForceWhiteAlbedo: 0
m_ForceUpdates: 0
m_FinalGather: 0
m_FinalGatherRayCount: 256
m_FinalGatherFiltering: 1
m_PVRCulling: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVREnvironmentSampleCount: 500
m_PVREnvironmentReferencePointCount: 2048
m_LightProbeSampleCountMultiplier: 4
m_PVRBounces: 2
m_PVRRussianRouletteStartBounce: 2
m_PVREnvironmentMIS: 0
m_PVRFilteringMode: 2
m_PVRDenoiserTypeDirect: 0
m_PVRDenoiserTypeIndirect: 0
m_PVRDenoiserTypeAO: 0
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 41149e767ac7dcd47a90a6570ba736eb
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@ -24,9 +24,9 @@ RenderSettings:
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1 m_AmbientIntensity: 1
m_AmbientMode: 0 m_AmbientMode: 3
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} m_SkyboxMaterial: {fileID: 0}
m_HaloStrength: 0.5 m_HaloStrength: 0.5
m_FlareStrength: 1 m_FlareStrength: 1
m_FlareFadeSpeed: 3 m_FlareFadeSpeed: 3
@ -37,7 +37,7 @@ RenderSettings:
m_ReflectionBounces: 1 m_ReflectionBounces: 1
m_ReflectionIntensity: 1 m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0} m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 705507994} m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
m_UseRadianceAmbientProbe: 0 m_UseRadianceAmbientProbe: 0
--- !u!157 &3 --- !u!157 &3
@ -51,7 +51,7 @@ LightmapSettings:
m_IndirectOutputScale: 1 m_IndirectOutputScale: 1
m_AlbedoBoost: 1 m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0 m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1 m_EnableBakedLightmaps: 0
m_EnableRealtimeLightmaps: 0 m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings: m_LightmapEditorSettings:
serializedVersion: 12 serializedVersion: 12
@ -72,7 +72,7 @@ LightmapSettings:
m_FinalGatherRayCount: 256 m_FinalGatherRayCount: 256
m_ReflectionCompression: 2 m_ReflectionCompression: 2
m_MixedBakeMode: 2 m_MixedBakeMode: 2
m_BakeBackend: 1 m_BakeBackend: 0
m_PVRSampling: 1 m_PVRSampling: 1
m_PVRDirectSampleCount: 32 m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500 m_PVRSampleCount: 500
@ -121,7 +121,7 @@ NavMeshSettings:
debug: debug:
m_Flags: 0 m_Flags: 0
m_NavMeshData: {fileID: 0} m_NavMeshData: {fileID: 0}
--- !u!1 &705507993 --- !u!1 &1131539293
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
@ -129,168 +129,99 @@ GameObject:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 705507995} - component: {fileID: 1131539295}
- component: {fileID: 705507994} - component: {fileID: 1131539294}
m_Layer: 0 m_Layer: 0
m_Name: Directional Light m_Name: Test
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
m_IsActive: 1 m_IsActive: 1
--- !u!108 &705507994 --- !u!114 &1131539294
Light: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 705507993} m_GameObject: {fileID: 1131539293}
m_Enabled: 1 m_Enabled: 1
serializedVersion: 10 m_EditorHideFlags: 0
m_Type: 1 m_Script: {fileID: 11500000, guid: 198888d66cd7476e973e8c52f7f8f04f, type: 3}
m_Shape: 0 m_Name:
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} m_EditorClassIdentifier:
m_Intensity: 1 restrictedAnimals:
m_Range: 10 id: 0
m_SpotAngle: 30 animalInterface:
m_InnerSpotAngle: 21.80208 id: 1
m_CookieSize: 10 animalAbstract:
m_Shadows: id: 2
m_Type: 2 animalBaseClass:
m_Resolution: -1 id: 3
m_CustomResolution: -1 animalsWithInterfaces:
m_Strength: 1 - id: 4
m_Bias: 0.05 - id: 5
m_NormalBias: 0.4 animalsWithInterfacesMenu: []
m_NearPlane: 0.2 classWithChildReferences:
m_CullingMatrixOverride: - integerValue: 0
e00: 1 animals:
e01: 0 id: 0
e02: 0 animalInterfaces:
e03: 0 id: 6
e10: 0 references:
e11: 1 version: 1
e12: 0 00000000:
e13: 0 type: {class: BlackApe, ns: , asm: SerializedReferenceExample}
e20: 0 data:
e21: 0 age: 0
e22: 1 food: {fileID: 0}
e23: 0 numberOfBones: 0
e30: 0 Tag:
e31: 0 00000001:
e32: 0 type: {class: RedCat, ns: , asm: SerializedReferenceExample}
e33: 1 data:
m_UseCullingMatrixOverride: 0 age: 0
m_Cookie: {fileID: 0} food: {fileID: 0}
m_DrawHalo: 0 numberOfBones: 0
m_Flare: {fileID: 0} Tag:
m_RenderMode: 0 00000002:
m_CullingMask: type: {class: , ns: , asm: }
serializedVersion: 2 00000003:
m_Bits: 4294967295 type: {class: GoldenCat, ns: , asm: SerializedReferenceExample}
m_RenderingLayerMask: 1 data:
m_Lightmapping: 1 age: 0
m_LightShadowCasterMode: 0 food: {fileID: 0}
m_AreaSize: {x: 1, y: 1} numberOfBones: 0
m_BounceIntensity: 1 Tag:
m_ColorTemperature: 6570 00000004:
m_UseColorTemperature: 0 type: {class: GoldenCat, ns: , asm: SerializedReferenceExample}
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} data:
m_UseBoundingSphereOverride: 0 age: 0
m_ShadowRadius: 0 food: {fileID: 0}
m_ShadowAngle: 0 numberOfBones: 0
--- !u!4 &705507995 Tag:
00000005:
type: {class: RedApe, ns: , asm: SerializedReferenceExample}
data:
age: 0
food: {fileID: 0}
numberOfBones: 0
Tag:
00000006:
type: {class: GreenFish, ns: , asm: SerializedReferenceExample}
data:
age: 0
food: {fileID: 0}
Tag:
--- !u!4 &1131539295
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 705507993} m_GameObject: {fileID: 1131539293}
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
m_LocalPosition: {x: 0, y: 3, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &963194225
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 963194228}
- component: {fileID: 963194227}
- component: {fileID: 963194226}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!81 &963194226
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 963194225}
m_Enabled: 1
--- !u!20 &963194227
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 963194225}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 0
orthographic size: 5
m_Depth: -1
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &963194228
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 963194225}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 1, z: -10} m_LocalPosition: {x: 0.4785227, y: 0.00097347796, z: -2.9921875}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 9fc0d4010bbf28b4594072e72b8655ab guid: 2cda990e2423bbf4892e6590ba056729
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:

View File

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
[Header("Restricted to DogBase and IApe")]
[SerializeReference]
[SerializeReferenceButton]
[SerializeReferenceUIRestrictionIncludeTypes(typeof(DogBase), typeof(IApe))]
public IAnimal restrictedAnimals = default;
[Header("Interface")]
[SerializeReference]
[SerializeReferenceButton]
public IAnimal animalInterface = default;
[Header("Abstract")]
[SerializeReference]
[SerializeReferenceButton]
public AbstractAnimal animalAbstract = default;
[Header("Base Class")]
[SerializeReference]
[SerializeReferenceButton]
public AnimalBase animalBaseClass = default;
[Header("List of interfaces")]
[SerializeReference]
[SerializeReferenceButton]
public List<IAnimal> animalsWithInterfaces = new List<IAnimal>();
[Header("List of Animals via MMB menu")]
[SerializeReference]
[SerializeReferenceMenu]
public List<AnimalBase> animalsWithInterfacesMenu = new List<AnimalBase>();
[Header("Class with serialized reference field")]
public List<ClassWithSerializedReferenceChild> classWithChildReferences = default;
}
[Serializable]
public class ClassWithSerializedReferenceChild
{
public int integerValue = default;
[SerializeReference]
[SerializeReferenceButton]
public AnimalBase animals = default;
[SerializeReference]
[SerializeReferenceButton]
public IAnimal animalInterfaces = default;
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 198888d66cd7476e973e8c52f7f8f04f
timeCreated: 1579584059

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 97e871ef367e1604391241355b1b3962
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c962b02723999754ba9b137d407b5ec0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,14 @@
using System;
using System.Linq;
public static class SerializeReferenceTypeRestrictionFilters
{
public static Func<Type, bool> TypeIsNotSubclassOrEqualOrHasInterface(Type[] types) => type =>
TypeIsSubclassOrEqualOrHasInterface(types).Invoke(type) == false;
public static Func<Type, bool> TypeIsSubclassOrEqualOrHasInterface(Type[] types) => type =>
types.Any(e => e.IsInterface ? TypeHasInterface(type, e) : TypeIsSubclassOrEqual(type, e));
public static bool TypeIsSubclassOrEqual(Type type, Type comparator) => type.IsSubclassOf(comparator) || type == comparator;
public static bool TypeHasInterface(this Type type, Type comparator) => type.GetInterface(comparator.ToString()) != null;
}

View File

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

View File

@ -0,0 +1,10 @@
using System;
using UnityEngine;
/// None of this types or interface types are valid.
[AttributeUsage(AttributeTargets.Field)]
public class SerializeReferenceUIRestrictionExcludeTypes : PropertyAttribute
{
public readonly Type[] Types;
public SerializeReferenceUIRestrictionExcludeTypes(params Type[] types) => Types = types;
}

View File

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

View File

@ -0,0 +1,10 @@
using System;
using UnityEngine;
/// Any of this types or interface types are valid. And only this types can be presented.
[AttributeUsage(AttributeTargets.Field)]
public class SerializeReferenceUIRestrictionIncludeTypes : PropertyAttribute
{
public readonly Type[] Types;
public SerializeReferenceUIRestrictionIncludeTypes(params Type[] types) => Types = types;
}

View File

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

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Reflection;
public static class SerializedReferenceUIBuiltInTypeRestrictions
{
public static IEnumerable<Func<Type, bool>> GetAllBuiltInTypeRestrictions(FieldInfo fieldInfo)
{
var result = new List<Func<Type, bool>>();
var attributeObjects = fieldInfo.GetCustomAttributes(false);
foreach (var attributeObject in attributeObjects)
{
switch (attributeObject)
{
case SerializeReferenceUIRestrictionIncludeTypes includeTypes:
result.Add(SerializeReferenceTypeRestrictionFilters.TypeIsSubclassOrEqualOrHasInterface(includeTypes.Types));
continue;
case SerializeReferenceUIRestrictionExcludeTypes excludeTypes:
result.Add(SerializeReferenceTypeRestrictionFilters.TypeIsNotSubclassOrEqualOrHasInterface(excludeTypes.Types));
continue;
}
}
return result;
}
}

View File

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

View File

@ -0,0 +1,3 @@
{
"name": "Textus.SerializeReferenceUI"
}

View File

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

View File

@ -1,4 +1,4 @@
# UnitySerializedReferenceUI # UnitySerializedReferenceUI
The UI for Unity's SerealizedReference attribute. It allows to change the instance type of field right in editor. The UI for Unity's SerealizedReference attribute. It allows to change the instance type of field right in editor.
Project is provided under Mit license which you can find in inner main folder Project is provided under Mit license which you can find in inner main folder ("SerializedReferenceUI")