diff --git a/.gitignore b/.gitignore index d2a4d12..ca78733 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ sysinfo.txt .vscode player_win_development_x86.pdb +Creative diff --git a/Assets/kode80/UnityTools/Colliders.meta b/Assets/kode80/UnityTools/Colliders.meta new file mode 100644 index 0000000..2ebd940 --- /dev/null +++ b/Assets/kode80/UnityTools/Colliders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c4c9bccd05a074d77bf9d50f576c70e9 +folderAsset: yes +timeCreated: 1467032627 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Colliders/Editor.meta b/Assets/kode80/UnityTools/Colliders/Editor.meta new file mode 100644 index 0000000..86e6f2b --- /dev/null +++ b/Assets/kode80/UnityTools/Colliders/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9daad138e977b46ae861415a7574cdf3 +folderAsset: yes +timeCreated: 1467032639 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Colliders/Editor/ChainColliderEditor.cs b/Assets/kode80/UnityTools/Colliders/Editor/ChainColliderEditor.cs new file mode 100644 index 0000000..b0e5344 --- /dev/null +++ b/Assets/kode80/UnityTools/Colliders/Editor/ChainColliderEditor.cs @@ -0,0 +1,89 @@ +using UnityEngine; +using UnityEditor; +using System; +using System.Collections; + +namespace kode80.Colliders +{ + [CustomEditor( typeof(ChainCollider))] + public class ChainColliderEditor : Editor + { + private int selectedPointIndex; + + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + if( GUILayout.Button( "Bake Colliders")) + { + var chain = target as ChainCollider; + chain.CreateColliders( chain.colliderParent == null ? chain.transform : chain.colliderParent); + chain.enabled = false; + } + } + + void OnSceneGUI() + { + var chain = target as ChainCollider; + if( chain.enabled == false) { return; } + + int count = chain.points.Length; + + for( int i=0; i(); + collider.size = size; + collider.transform.localPosition = p0 + delta * 0.5f; + collider.transform.localRotation = rotation; + collider.isTrigger = isTrigger; + collider.material = material; + + return collider; + } + + public void InsertPoint( int index) + { + index = Math.Min( Math.Max( index, 0), points.Length); + + Vector3 before = points[Math.Min( Math.Max( index-1, 0), points.Length-1)]; + Vector3 after = points[Math.Min( Math.Max( index, 0), points.Length-1)]; + Vector3 newPoint = before + ((after - before) * 0.5f); + + var list = points.ToList(); + list.Insert( index, newPoint); + points = list.ToArray(); + } + + public void DeletePoint( int index) + { + index = Math.Min( Math.Max( index, 0), points.Length - 1); + + var list = points.ToList(); + list.RemoveAt( index); + points = list.ToArray(); + } + + public void ApplyParentRotation() + { + int count = points.Length; + for( int i=0; i(); + collider.size = size; + collider.transform.localRotation = Quaternion.Euler( 0.0f, rotationY, 0.0f); + collider.isTrigger = isTrigger; + collider.material = material; + return collider; + } + + private SphereCollider CreateCapCollider( bool isTop) + { + var collider = new GameObject( "Cylinder_Cap_" + (isTop ? "Top" : "Bottom")).AddComponent(); + collider.radius = radius; + collider.center = new Vector3( 0.0f, height * (isTop ? 0.5f : -0.5f), 0.0f); + collider.isTrigger = isTrigger; + collider.material = material; + return collider; + } + + private Vector3 CalculateBoxSize() + { + float circumference = radius * 2.0f * Mathf.PI; + + float width = circumference / boxCount; + width = radius / boxCount * 2.0f * widthScale; + + return new Vector3( width, height, radius * 2.0f); + } + + private float CalculateRotationStep() + { + return 360.0f / boxCount; + } + } +} diff --git a/Assets/kode80/UnityTools/Colliders/Scripts/CylinderCollider.cs.meta b/Assets/kode80/UnityTools/Colliders/Scripts/CylinderCollider.cs.meta new file mode 100644 index 0000000..3aba588 --- /dev/null +++ b/Assets/kode80/UnityTools/Colliders/Scripts/CylinderCollider.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9a3869ef76a684c14a9308c7278c4de1 +timeCreated: 1467032531 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common.meta b/Assets/kode80/UnityTools/Common.meta new file mode 100644 index 0000000..b90c725 --- /dev/null +++ b/Assets/kode80/UnityTools/Common.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 70121cfd97c114e3faf677a92dbe7428 +folderAsset: yes +timeCreated: 1467602761 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Examples.meta b/Assets/kode80/UnityTools/Common/Examples.meta new file mode 100644 index 0000000..2705724 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Examples.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c48cdcb93ffd3444999567bf2d21c28f +folderAsset: yes +timeCreated: 1467655802 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTest.cs b/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTest.cs new file mode 100644 index 0000000..d78250d --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTest.cs @@ -0,0 +1,26 @@ +using UnityEngine; +using System.Collections; +using kode80.Common; + +public class OctreeMeshTest : MonoBehaviour +{ + public Mesh targetMesh; + [Range( 1, 8)] + public int maxDepth = 1; + private MeshOctree octree; + + void OnValidate() + { + if( targetMesh != null) + { + octree = new MeshOctree( targetMesh, maxDepth); + } + } + + void OnDrawGizmos() + { + if( octree != null) { + octree.DrawGizmos( Color.red); + } + } +} diff --git a/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTest.cs.meta b/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTest.cs.meta new file mode 100644 index 0000000..d0d7402 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTest.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 909e669f180534e57bfefa931e78b532 +timeCreated: 1467664065 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTestScene.unity b/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTestScene.unity new file mode 100644 index 0000000..765cd41 Binary files /dev/null and b/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTestScene.unity differ diff --git a/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTestScene.unity.meta b/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTestScene.unity.meta new file mode 100644 index 0000000..3755477 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Examples/OctreeMeshTestScene.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e3619808bd0e4116a9edfd91a8514d9 +timeCreated: 1467664488 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTest.cs b/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTest.cs new file mode 100644 index 0000000..d75090c --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTest.cs @@ -0,0 +1,69 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using kode80.Common; + +#if UNITY_EDITOR +using UnityEditor; +#endif + +[ExecuteInEditMode] +public class OctreeTransformTest : MonoBehaviour +{ + public bool recreateOctree; + private TransformOctree octree; + private List> foundNodes; + + // Use this for initialization + void Start () { + + } + + void Update() + { + RecreateOctree(); + + #if UNITY_EDITOR + if( Selection.activeGameObject != null) { + foundNodes = octree.GetNodesContainingItem( Selection.activeGameObject.transform); + } + else { + foundNodes = null; + } + #endif + } + + void OnDrawGizmos() + { + if( octree == null) { return; } + + octree.DrawGizmos( Color.red); + + if( foundNodes != null) + { + Gizmos.color = Color.green; + foreach( var node in foundNodes) { + node.DrawGizmo(); + } + } + } + + private void RecreateOctree() + { + Transform[] transforms = GetComponentsInChildren( true); + Bounds bounds = new Bounds(); + List contents = new List(); + + foreach( Transform t in transforms) + { + if( t != transform) + { + bounds.Encapsulate(t.position); + contents.Add( t); + } + } + + octree = new TransformOctree( bounds, 8); + octree.Add( contents); + } +} diff --git a/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTest.cs.meta b/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTest.cs.meta new file mode 100644 index 0000000..e41f8e9 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTest.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a43da294b534f4a50b4f919309f5f9a0 +timeCreated: 1467648510 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTestScene.unity b/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTestScene.unity new file mode 100644 index 0000000..8b75bfe Binary files /dev/null and b/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTestScene.unity differ diff --git a/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTestScene.unity.meta b/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTestScene.unity.meta new file mode 100644 index 0000000..c02eeac --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Examples/OctreeTransformTestScene.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b6cd79679ba794d2fb1940e9030aab02 +timeCreated: 1467649395 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Scripts.meta b/Assets/kode80/UnityTools/Common/Scripts.meta new file mode 100644 index 0000000..bfdb48b --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 092c6b5433d8241a4ac3f469b971db82 +folderAsset: yes +timeCreated: 1467602841 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Scripts/MeshOctree.cs b/Assets/kode80/UnityTools/Common/Scripts/MeshOctree.cs new file mode 100644 index 0000000..91e8e80 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Scripts/MeshOctree.cs @@ -0,0 +1,28 @@ +using UnityEngine; +using System.Collections; + +namespace kode80.Common +{ + public class MeshOctree : Octree + { + private Mesh mesh; + + public MeshOctree( Mesh mesh, int maxDepth = 1) : base( mesh.bounds, null, maxDepth) + { + this.mesh = mesh; + rootNode.itemOverlapsBounds = HandleItemOverlapsBounds; + + int count = mesh.triangles.Length; + for( int i=0; i + { + protected OctreeNode rootNode; + + private int maxDepth; + public int MaxDepth { + get { return maxDepth; } + set { + if( maxDepth != value) + { + maxDepth = value; + Regenerate(); + } + } + } + + public Bounds Bounds { get { return rootNode.Bounds; } } + + public Octree( Bounds bounds, OctreeNode.ItemOverlapsBounds itemOverlapsBounds, int maxDepth = 1) + { + rootNode = new OctreeNode( bounds, itemOverlapsBounds); + MaxDepth = maxDepth; + } + + public void Add( T item) + { + rootNode.Add( item); + Regenerate(); + } + + public void Add( IList items) + { + rootNode.Add( items); + Regenerate(); + } + + public List> GetNodesContainingItem( T item) + { + return rootNode.GetNodesContainingItem( item); + } + + public void DrawGizmos( Color color) + { + Color previousColor = Gizmos.color; + Gizmos.color = color; + DrawGizmos( rootNode); + Gizmos.color = previousColor; + } + + private void DrawGizmos( OctreeNode node) + { + if( node.SubNodes == null) { + Gizmos.DrawWireCube( node.Bounds.center, node.Bounds.size); + } + else { + for( int i=0; i<8; i++) { + node.SubNodes[i].DrawGizmo(); + DrawGizmos( node.SubNodes[i]); + } + } + } + + protected void Regenerate() + { + rootNode.Collapse(); + SubdivideOctree( rootNode, 0, maxDepth); + } + + private void SubdivideOctree( OctreeNode node, int currentDepth, int maxDepth) + { + if( node.Contents.Count > 1 && currentDepth < maxDepth) + { + node.Subdivide(); + for( int i=0; i<8; i++) { + SubdivideOctree( node.SubNodes[i], currentDepth+1, maxDepth); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/kode80/UnityTools/Common/Scripts/Octree.cs.meta b/Assets/kode80/UnityTools/Common/Scripts/Octree.cs.meta new file mode 100644 index 0000000..52ee7fd --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Scripts/Octree.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0224c3da792d2405a9fe772661f3d290 +timeCreated: 1467602771 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Scripts/OctreeNode.cs b/Assets/kode80/UnityTools/Common/Scripts/OctreeNode.cs new file mode 100644 index 0000000..e968467 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Scripts/OctreeNode.cs @@ -0,0 +1,136 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +namespace kode80.Common +{ + public class OctreeNode + { + public delegate bool ItemOverlapsBounds( T item, Bounds bounds); + public ItemOverlapsBounds itemOverlapsBounds; + + private OctreeNode[] subNodes; + public OctreeNode[] SubNodes { get { return subNodes; } } + + private List contents; + public List Contents { get { return contents; } } + + private Bounds bounds; + public Bounds Bounds { get { return bounds; } } + + public OctreeNode( Bounds bounds, ItemOverlapsBounds itemOverlapsBounds) + { + contents = new List(); + this.bounds = bounds; + this.itemOverlapsBounds = itemOverlapsBounds; + } + + public void Add( T item) + { + if( itemOverlapsBounds( item, bounds)) + { + if( subNodes == null) { + contents.Add( item); + } + else { + for( int i=0; i<8; i++) { + subNodes[i].Add( item); + } + } + } + } + + public void Add( IList items) + { + int count = items.Count; + for( int i=0; i[8]; + + int index=0; + for( int z=0; z<2; z++) { + for( int y=0; y<2; y++) { + for( int x=0; x<2; x++) { + bounds.center = new Vector3( (bounds.size.x * -0.5f) + (bounds.size.x * x), + (bounds.size.y * -0.5f) + (bounds.size.y * y), + (bounds.size.z * -0.5f) + (bounds.size.z * z)); + bounds.center += this.bounds.center; + subNodes[index] = new OctreeNode( bounds, itemOverlapsBounds); + int count = contents.Count; + for( int i=0; i GetAllContents() + { + List allContents = new List(); + CollectContents( this, allContents); + return allContents; + } + + public void Collapse() + { + contents = GetAllContents(); + subNodes = null; + } + + public List> GetNodesContainingItem( T item) + { + var nodes = new List>(); + SearchNodesContainingItem( item, nodes); + return nodes; + } + + public void DrawGizmo() + { + Gizmos.DrawWireCube( bounds.center, bounds.size); + } + + protected void SearchNodesContainingItem( T item, List> foundNodes) + { + if( itemOverlapsBounds( item, bounds)) + { + foundNodes.Add( this); + + if( subNodes != null) + { + for( int i=0; i<8; i++) { + subNodes[i].SearchNodesContainingItem( item, foundNodes); + } + } + } + } + + protected void CollectContents( OctreeNode node, List allContents) + { + allContents.AddRange( node.contents); + + if( node.SubNodes != null) + { + for( int i=0; i<8; i++) { + CollectContents( node.SubNodes[i], allContents); + } + } + } + + private Bounds GetSubNodeBounds() + { + Bounds subBounds = new Bounds(); + subBounds.size = bounds.size * 0.5f; + return subBounds; + } + } +} \ No newline at end of file diff --git a/Assets/kode80/UnityTools/Common/Scripts/OctreeNode.cs.meta b/Assets/kode80/UnityTools/Common/Scripts/OctreeNode.cs.meta new file mode 100644 index 0000000..196f977 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Scripts/OctreeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 64116b4da8e1f4db0ae2884bf6de9915 +timeCreated: 1467602886 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/Common/Scripts/TransformOctree.cs b/Assets/kode80/UnityTools/Common/Scripts/TransformOctree.cs new file mode 100644 index 0000000..8a74907 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Scripts/TransformOctree.cs @@ -0,0 +1,17 @@ +using UnityEngine; +using System.Collections; + +namespace kode80.Common +{ + public class TransformOctree : Octree + { + public TransformOctree( Bounds bounds, int maxDepth=1) : base( bounds, HandleItemOverlapsBounds, maxDepth) + { + } + + private static bool HandleItemOverlapsBounds (Transform item, Bounds bounds) + { + return bounds.Contains( item.position); + } + } +} \ No newline at end of file diff --git a/Assets/kode80/UnityTools/Common/Scripts/TransformOctree.cs.meta b/Assets/kode80/UnityTools/Common/Scripts/TransformOctree.cs.meta new file mode 100644 index 0000000..86fd674 --- /dev/null +++ b/Assets/kode80/UnityTools/Common/Scripts/TransformOctree.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5bf5b38f09d134bd08de44abd7a11519 +timeCreated: 1467662220 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/EditorTools/Editor/Diff.cs b/Assets/kode80/UnityTools/EditorTools/Editor/Diff.cs new file mode 100644 index 0000000..63e800f --- /dev/null +++ b/Assets/kode80/UnityTools/EditorTools/Editor/Diff.cs @@ -0,0 +1,181 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; + +namespace kode80.EditorTools +{ + public struct DiffRecord + { + public GameObject gameObjectA; + public GameObject gameObjectB; + public string propertyName; + public string gameObjectAPath; + public string gameObjectBPath; + public SerializedPropertyType propertyType; + } + + public class Diff + { + private Vector2 scrollPosition; + + public List Compare( GameObject gameObjectA, GameObject gameObjectB) + { + var diffs = new List(); + Compare( gameObjectA, gameObjectB, "", "", diffs); + return diffs; + } + + private void Compare( GameObject gameObjectA, GameObject gameObjectB, + string gameObjectAPath, string gameObjectBPath, + List diffs) + { + if( gameObjectAPath == "") { gameObjectAPath = gameObjectA.name; } + else { gameObjectAPath += "." + gameObjectA.name; } + + if( gameObjectBPath == "") { gameObjectBPath = gameObjectB.name; } + else { gameObjectBPath += "." + gameObjectB.name; } + + var componentsA = gameObjectA.GetComponents(); + var componentsB = gameObjectB.GetComponents(); + + if( componentsA.Length != componentsB.Length) + { + return; + } + + int count = componentsA.Length; + + for( int i=0; i diffs; + private int selectedIndex = -1; + private int stopHighlightCount; + + [MenuItem( "Window/kode80/Editor Tools/Diff")] + public static void Init() + { + EditorWindow.GetWindow( "Diff").Show(); + } + + void OnEnable() + { + } + + void OnDisable() + { + } + + void OnGUI() + { + if( diffs == null) { + diffs = new List(); + } + + bool refresh = false; + var newGameObject = EditorGUILayout.ObjectField( gameObjectA, typeof(GameObject), true) as GameObject; + if( newGameObject != gameObjectA) + { + gameObjectA = newGameObject; + refresh = true; + } + + newGameObject = EditorGUILayout.ObjectField( gameObjectB, typeof(GameObject), true) as GameObject; + if( newGameObject != gameObjectB) + { + gameObjectB = newGameObject; + refresh = true; + } + + if( GUILayout.Button( "Refresh")) { + refresh = true; + } + + if( refresh && + gameObjectA != null && + gameObjectB != null) + { + selectedIndex = -1; + diffs = new Diff().Compare( gameObjectA, gameObjectB); + } + + + scrollPosition = EditorGUILayout.BeginScrollView( scrollPosition); + + int count = diffs.Count; + + for( int i=0; i -1) + { + Highlighter.Highlight( "Inspector", diffs[selectedIndex].propertyName); + stopHighlightCount = 20; + } + } + + void Update() + { + if( stopHighlightCount > 0) + { + stopHighlightCount--; + if( stopHighlightCount == 0) + { + Highlighter.Stop(); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/kode80/UnityTools/EditorTools/Editor/DiffWindow.cs.meta b/Assets/kode80/UnityTools/EditorTools/Editor/DiffWindow.cs.meta new file mode 100644 index 0000000..a55c592 --- /dev/null +++ b/Assets/kode80/UnityTools/EditorTools/Editor/DiffWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c24c9be06bff644cba6aca6e63015c0b +timeCreated: 1467947130 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/EditorTools/Editor/SceneViewCameraEditor.cs b/Assets/kode80/UnityTools/EditorTools/Editor/SceneViewCameraEditor.cs new file mode 100644 index 0000000..d6359e3 --- /dev/null +++ b/Assets/kode80/UnityTools/EditorTools/Editor/SceneViewCameraEditor.cs @@ -0,0 +1,128 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + +namespace kode80.EditorTools +{ + [CustomEditor(typeof(SceneViewCamera))] + public class SceneViewCameraEditor : Editor + { + private int frameCount; + private bool isForwardsPressed; + private bool isBackwardsPressed; + private bool isLeftPressed; + private bool isRightPressed; + private bool isUpPressed; + private bool isDownPressed; + private bool isRunPressed; + + private Tool previousTool; + private bool cameraControlsEnabled; + private float movementSpeed = 0.005f; + + void OnEnable() + { + frameCount = 0; + EditorApplication.update += EditorUpdate; + + previousTool = Tools.current; + Tools.current = Tool.None; + } + + void OnDisable() + { + EditorApplication.update -= EditorUpdate; + Tools.current = previousTool; + } + + void OnSceneGUI() + { + Tools.current = Tool.None; + + Handles.BeginGUI(); + GUILayout.BeginArea( new Rect( 5, 5, 200, 100)); + var rect = EditorGUILayout.BeginVertical(); + GUI.Box( rect, GUIContent.none, EditorStyles.helpBox); + + bool newCameraEnabled = GUILayout.Toggle( cameraControlsEnabled, "Camera Enabled"); + if( newCameraEnabled != cameraControlsEnabled) + { + cameraControlsEnabled = newCameraEnabled; + if( cameraControlsEnabled) + { + EditorApplication.ExecuteMenuItem( "GameObject/Align With View"); + } + } + movementSpeed = GUILayout.HorizontalSlider( movementSpeed, 0.0f, 0.1f); + + EditorGUILayout.EndVertical(); + GUILayout.EndArea(); + Handles.EndGUI(); + + HandleCameraKeyInput(); + } + + void HandleCameraKeyInput() + { + var currentEvent = Event.current; + + if( currentEvent != null && cameraControlsEnabled) + { + if( currentEvent.type == EventType.KeyDown) + { + if( currentEvent.keyCode == KeyCode.W) { isForwardsPressed = true; } + if( currentEvent.keyCode == KeyCode.S) { isBackwardsPressed = true; } + if( currentEvent.keyCode == KeyCode.A) { isLeftPressed = true; } + if( currentEvent.keyCode == KeyCode.D) { isRightPressed = true; } + if( currentEvent.keyCode == KeyCode.Q) { isDownPressed = true; } + if( currentEvent.keyCode == KeyCode.E) { isUpPressed = true; } + + if( currentEvent.keyCode == KeyCode.C) { isRunPressed = true; } + + currentEvent.Use(); + } + else if( currentEvent.type == EventType.KeyUp) + { + if( currentEvent.keyCode == KeyCode.W) { isForwardsPressed = false; } + if( currentEvent.keyCode == KeyCode.S) { isBackwardsPressed = false; } + if( currentEvent.keyCode == KeyCode.A) { isLeftPressed = false; } + if( currentEvent.keyCode == KeyCode.D) { isRightPressed = false; } + if( currentEvent.keyCode == KeyCode.Q) { isDownPressed = false; } + if( currentEvent.keyCode == KeyCode.E) { isUpPressed = false; } + + if( currentEvent.keyCode == KeyCode.C) { isRunPressed = false; } + + currentEvent.Use(); + } + } + } + + void EditorUpdate() + { + var cameraTransform = (target as SceneViewCamera).transform; + + if( cameraControlsEnabled) + { + if( frameCount % 6 == 0) + { + Vector3 movement = Vector3.zero; + float speed = movementSpeed * (isRunPressed ? 3.0f : 1.0f); + + if( isForwardsPressed) { movement += cameraTransform.forward * speed; } + else if( isBackwardsPressed) { movement -= cameraTransform.forward * speed; } + + if( isLeftPressed) { movement -= cameraTransform.right * speed; } + else if( isRightPressed) { movement += cameraTransform.right * speed; } + + if( isUpPressed) { movement += cameraTransform.up * speed; } + else if( isDownPressed) { movement -= cameraTransform.up * speed; } + + cameraTransform.position += movement; + + EditorApplication.ExecuteMenuItem( "GameObject/Align View to Selected"); + } + frameCount++; + } + } + } +} \ No newline at end of file diff --git a/Assets/kode80/UnityTools/EditorTools/Editor/SceneViewCameraEditor.cs.meta b/Assets/kode80/UnityTools/EditorTools/Editor/SceneViewCameraEditor.cs.meta new file mode 100644 index 0000000..c5308bb --- /dev/null +++ b/Assets/kode80/UnityTools/EditorTools/Editor/SceneViewCameraEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: abf4ce76ad0064e6d98b2ffbe67e6ab9 +timeCreated: 1467032543 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/kode80/UnityTools/EditorTools/Scripts/SceneViewCamera.cs b/Assets/kode80/UnityTools/EditorTools/Scripts/SceneViewCamera.cs new file mode 100644 index 0000000..b18cb61 --- /dev/null +++ b/Assets/kode80/UnityTools/EditorTools/Scripts/SceneViewCamera.cs @@ -0,0 +1,19 @@ +using UnityEngine; +using System.Collections; + +namespace kode80.EditorTools +{ + public class SceneViewCamera : MonoBehaviour + { + + // Use this for initialization + void Start () { + + } + + // Update is called once per frame + void Update () { + + } + } +} \ No newline at end of file diff --git a/Assets/kode80/UnityTools/EditorTools/Scripts/SceneViewCamera.cs.meta b/Assets/kode80/UnityTools/EditorTools/Scripts/SceneViewCamera.cs.meta new file mode 100644 index 0000000..e621bcb --- /dev/null +++ b/Assets/kode80/UnityTools/EditorTools/Scripts/SceneViewCamera.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 96f696ec15e2b40cbadd9ba97d006193 +timeCreated: 1467032531 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset index 042664c..9164da8 100644 Binary files a/ProjectSettings/GraphicsSettings.asset and b/ProjectSettings/GraphicsSettings.asset differ diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index f78e739..cceef8f 100644 Binary files a/ProjectSettings/ProjectSettings.asset and b/ProjectSettings/ProjectSettings.asset differ diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 3c4cb34..31e0b08 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 5.3.0f4 +m_EditorVersion: 5.4.0b21 m_StandardAssetsVersion: 0 diff --git a/README.md b/README.md index 8eaab9f..836e4fa 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,9 @@ Various editor/GUI tools for Unity3D * Options for super size rendering & framerate * Automatic MP4/GIF export (requires [FFmpeg](http://ffmpeg.org/)) * AssetUpdate: automatic asset update system for non-asset store assets +* SceneViewCamera: hack to control the scene view's camera, allowing for high-precision (1/100th of a Unit) movement +* Composite Colliders: new collider types generated from primitives; Cylinders (with optional caps), Chains +* Generic Octree: simple octree implementation, easily extendable via C# generics and delegates Download latest package: [kode80UnityTools.unitypackage](https://raw.github.com/kode80/UnityTools/master/kode80UnityTools.unitypackage)