Move Opsive editor scripts under an Editor subdirectory to ensure correct compilation as editor scripts

This commit is contained in:
2026-07-01 20:42:21 +07:00
parent 01048074ee
commit 7cf09ac8b1
336 changed files with 377 additions and 231 deletions

View File

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

View File

@@ -0,0 +1,297 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Controls
{
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
/// <summary>
/// Uses Unity's TreeView class to create a single column tree view that does not have any children. The elements can be reordered and searched.
/// </summary>
public class FlatTreeView<T> : TreeView where T : TreeModal
{
private const string c_GenericDragID = "ModalDragging";
private TreeModal m_TreeModal;
private List<TreeViewItem> m_Rows = new List<TreeViewItem>();
private TreeViewItem m_Root;
private Action m_TreeChange;
public TreeModal TreeModal { get { return m_TreeModal; } set { m_TreeModal = value; Reload(); } }
public Action TreeChange { get { return m_TreeChange; } set { m_TreeChange = value; } }
/// <summary>
/// Constructor for FlatTreeView.
/// </summary>
/// <param name="state">The TreeView's state.</param>
/// <param name="modal">The TreeView's data.</param>
public FlatTreeView(TreeViewState state, TreeModal modal) : base (state)
{
showBorder = true;
m_TreeModal = modal;
Reload();
}
/// <summary>
/// Creates the root element of the TreeView.
/// </summary>
/// <returns>The TreeView's root element.</returns>
protected override TreeViewItem BuildRoot()
{
m_Root = new TreeViewItem(0, -1, "Root");
return m_Root;
}
/// <summary>
/// Creates all of the TreeView rows.
/// </summary>
/// <param name="root">The root of the tree.</param>
/// <returns>A list of all of the TreeView rows.</returns>
protected override IList<TreeViewItem> BuildRows(TreeViewItem root)
{
m_Rows.Clear();
if (!string.IsNullOrEmpty(searchString) && root.children != null) {
// Not all of the rows are shown while searching.
Search(root, m_Rows);
} else {
// Show all of the rows.
var rowCount = m_TreeModal.GetRowCount();
for (int i = 0; i < rowCount; ++i) {
m_Rows.Add(new TreeViewItem(i, -1));
}
SetupParentsAndChildrenFromDepths(root, m_Rows);
// If the children list was null then the tree hasn't been initialized yet. At this point the tree would have been initialized so
// perform a serach if necessary while the list is initialized.
if (!string.IsNullOrEmpty(searchString)) {
m_Rows.Clear();
Search(root, m_Rows);
}
}
return m_Rows;
}
/// <summary>
/// Searches the tree for the searchString.
/// </summary>
/// <param name="root">The root of the tree.</param>
/// <param name="result">Any found rows.</param>
private void Search(TreeViewItem root, List<TreeViewItem> result)
{
for (int i = 0; i < root.children.Count; ++i) {
if (m_TreeModal.MatchesSearch(root.children[i].id, searchString)) {
result.Add(root.children[i]);
}
}
}
/// <summary>
/// Returns a custom height for the row.
/// </summary>
/// <param name="row">The row to get the custom height of.</param>
/// <param name="item">The item to get the custom height of.</param>
/// <returns>The custom height for the row.</returns>
protected override float GetCustomRowHeight(int row, TreeViewItem item)
{
var height = m_TreeModal.GetRowHeight(item, state);
// -1 indicates the model doesn't supply the height.
if (height != -1) {
return height;
}
return base.GetCustomRowHeight(row, item);
}
/// <summary>
/// Draws the row with the specified arguments.
/// </summary>
/// <param name="args">The row to draw.</param>
protected override void RowGUI(RowGUIArgs args)
{
var rowRect = args.rowRect;
rowRect.x = GetContentIndent(args.item);
m_TreeModal.RowGUI(rowRect, args.item, state);
}
/// <summary>
/// Called when the TreeView changes selection.
/// </summary>
/// <param name="selectedIds">The new ids being selected.</param>
protected override void SelectionChanged(IList<int> selectedIds)
{
base.SelectionChanged(selectedIds);
RefreshCustomRowHeights();
Repaint();
// Notify those interested that there was a change - this allows the tree to be serialized.
if (m_TreeChange != null) {
m_TreeChange();
}
}
/// <summary>
/// Can the TreeView have multiple selections?
/// </summary>
/// <param name="item">Can this item be part of a multiselection?</param>
/// <returns>True if the TreeView can have multiple selections.</returns>
protected override bool CanMultiSelect(TreeViewItem item)
{
return false;
}
/// <summary>
/// Can the row be dragged?
/// </summary>
/// <param name="args">The row that is trying to be dragged.</param>
/// <returns>True if the row can be dragged.</returns>
protected override bool CanStartDrag(CanStartDragArgs args)
{
return !hasSearch;
}
/// <summary>
/// Prepares the row for a drag.
/// </summary>
/// <param name="args">The row that is being dragged.</param>
protected override void SetupDragAndDrop(SetupDragAndDropArgs args)
{
DragAndDrop.PrepareStartDrag();
var draggedRows = new List<TreeViewItem>();
var rows = GetRows();
// Convert the row IDs to row items.
for (int i = 0; i < rows.Count; ++i) {
for (int j = 0; j < args.draggedItemIDs.Count; ++j) {
if (rows[i].id == args.draggedItemIDs[j]) {
draggedRows.Add(rows[i]);
break;
}
}
}
// Start the drag.
DragAndDrop.SetGenericData(c_GenericDragID, draggedRows);
DragAndDrop.objectReferences = new UnityEngine.Object[] { }; // Required for dragging to work.
DragAndDrop.StartDrag("Drag");
}
/// <summary>
/// The row is being dragged - handle the dragging.
/// </summary>
/// <param name="args">The row that is being dragged.</param>
/// <returns>The status of the drag.</returns>
protected override DragAndDropVisualMode HandleDragAndDrop(DragAndDropArgs args)
{
// Return early if the dragging is occurring from a different window.
var draggedRows = DragAndDrop.GetGenericData(c_GenericDragID) as List<TreeViewItem>;
if (draggedRows == null) {
return DragAndDropVisualMode.None;
}
switch (args.dragAndDropPosition) {
case DragAndDropPosition.UponItem: // Dropping on top of other items is not allowed in a flat tree.
return DragAndDropVisualMode.None;
case DragAndDropPosition.BetweenItems: // The item can be dropped in between other items.
{
if (args.performDrop) {
// Do the drop.
OnDropDraggedElementsAtIndex(draggedRows, args.insertAtIndex == -1 ? 0 : args.insertAtIndex);
}
return DragAndDropVisualMode.Move;
}
case DragAndDropPosition.OutsideItems: // The item will be dropped to the last row if it is outside the tree.
{
if (args.performDrop) {
// Do the drop.
OnDropDraggedElementsAtIndex(draggedRows, m_Root.children.Count - 1);
}
return DragAndDropVisualMode.Move;
}
default:
Debug.LogError("Unhandled enum " + args.dragAndDropPosition);
return DragAndDropVisualMode.None;
}
}
/// <summary>
/// The rows specified have been dropped at the insert index.
/// </summary>
/// <param name="draggedRows">The rows that have been dropped.</param>
/// <param name="insertIndex">The index to insert the dropped rows at.</param>
public virtual void OnDropDraggedElementsAtIndex(List<TreeViewItem> draggedRows, int insertIndex)
{
// Convert the rows indicies to row ids.
var draggedElements = new List<int>();
for (int i = 0; i < draggedRows.Count; ++i) {
draggedElements.Add(draggedRows[i].id);
}
// Let the model to the drop.
var insertIDs = m_TreeModal.MoveRows(draggedElements, insertIndex);
// Update the selection.
SetSelection(insertIDs, TreeViewSelectionOptions.RevealAndFrame);
RefreshCustomRowHeights();
// Notify those interested that the tree has changed.
if (m_TreeChange != null) {
m_TreeChange();
}
}
}
/// <summary>
/// The TreeModal class acts as the data source for the tree.
/// </summary>
[Serializable]
public abstract class TreeModal
{
protected Action m_BeforeModalChange;
protected Action m_AfterModalChange;
public Action BeforeModalChange { get { return m_BeforeModalChange; } set { m_BeforeModalChange = value; } }
public Action AfterModalChange { get { return m_AfterModalChange; } set { m_AfterModalChange = value; } }
/// <summary>
/// Returns the number of rows in the tree.
/// </summary>
/// <returns>The number of rows in the tree.</returns>
public abstract int GetRowCount();
/// <summary>
/// Returns the height of the row.
/// </summary>
/// <param name="item">The item that occupies the row with the requested height.</param>
/// <param name="state">The state of the tree.</param>
/// <returns>The height of the row.</returns>
public virtual float GetRowHeight(TreeViewItem item, TreeViewState state) { return -1; }
/// <summary>
/// Draws the GUI for the row.
/// </summary>
/// <param name="rowRect">The rect of the row being drawn.</param>
/// <param name="item">The item that occupies the row which is being drawn.</param>
/// <param name="state">The state of the tree.</param>
public abstract void RowGUI(Rect rowRect, TreeViewItem item, TreeViewState state);
/// <summary>
/// Moves the rows to the specified index.
/// </summary>
/// <param name="rows">The rows being moved.</param>
/// <param name="insertIndex">The index to insert the rows at.</param>
/// <returns>An updated list of row ids.</returns>
public abstract List<int> MoveRows(List<int> rows, int insertIndex);
/// <summary>
/// Does the specified row id match the search?
/// </summary>
/// <param name="id">The id of the row.</param>
/// <param name="searchString">The string value of the search.</param>
/// <returns>True if the row matches the search string.</returns>
public virtual bool MatchesSearch(int id, string searchString) { return false; }
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: e3e62fb50e9ec5c448edef976a8c3248
timeCreated: 1500665131
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: a4d2cff4316a64946b786d75f681cd33
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: e152e9061481aab429f2b07a70c12d2e
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: 21eff06b5e4af0e478ea75270aca329a
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: aff49c3d1ef455d488b96b6ed77550b0
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

View File

@@ -0,0 +1,98 @@
fileFormatVersion: 2
guid: 0c1b703cff1f7104f936538f21b236f8
timeCreated: 1559507090
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: cc50d62765d4d79479ddf540cac0989b
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: 01290b743a16c0946b599beba004ca10
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: b847fb48acf99c6478bfdc892f0276fc
timeCreated: 1537206527
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Android
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: 58591f58da2eed6429f27c500d2f5a98
timeCreated: 1535390396
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Android
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: 4d9d8217015eee543ac1b745a096016d
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: ba8a6a7b5fe943b48bef5d532c257d38
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: 630622cb32bb7e64da8e2c1abbfdb1a3
timeCreated: 1535390396
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Android
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 B

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: 14890942c77df924d95bfdf229fcffe5
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 999 B

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: 487848bbccf6d414bacf8e840467e094
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: ecac100d11bb3dc40a93d7b1e30c015a
timeCreated: 1535390396
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Android
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

View File

@@ -0,0 +1,98 @@
fileFormatVersion: 2
guid: 60a4914a9917cb94c81ebda228bd3488
timeCreated: 1559507090
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 B

View File

@@ -0,0 +1,121 @@
fileFormatVersion: 2
guid: 693572ffb4740d04a9dbad616c8864e1
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 9
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -100
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- serializedVersion: 2
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
vertices: []
indices:
edges: []
weights: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

View File

@@ -0,0 +1,98 @@
fileFormatVersion: 2
guid: 0cd8dbda5671b674982a1a18863b87c0
timeCreated: 1559507090
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: 20a2a7d0dc8114f4083f51b8883d06b6
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: ee727c0b6401c8f4db0126f95f518541
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 530 B

View File

@@ -0,0 +1,98 @@
fileFormatVersion: 2
guid: e2150fcaaf9a0a34baf8e5554d64da37
timeCreated: 1559507090
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: 088c80b2883e964498350b2075ecde18
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: 71fd51a904de3f14086279a41bec5b78
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: 32f45dfc0d71947458758e055696a118
timeCreated: 1535390396
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Android
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: 997f4ee10d474ab44ab9d9a030110117
timeCreated: 1535390396
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Android
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 B

View File

@@ -0,0 +1,98 @@
fileFormatVersion: 2
guid: 32b8693ef0262db4982764875d412b2b
timeCreated: 1559507090
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 B

View File

@@ -0,0 +1,108 @@
fileFormatVersion: 2
guid: c596edb1305969e4c9bf7d24926cd658
timeCreated: 1520957480
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

View File

@@ -0,0 +1,108 @@
fileFormatVersion: 2
guid: 3061bd671d9c87947bb5b99a48ab7e1b
timeCreated: 1520957479
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

View File

@@ -0,0 +1,108 @@
fileFormatVersion: 2
guid: b34170890b9b9d1469d9b451fddc01dd
timeCreated: 1520957480
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: ffb6d9e2798b5f8418dd9d5c9fc9118f
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,84 @@
fileFormatVersion: 2
guid: c1502f6cab2c3a542bb77c572d8567de
timeCreated: 1533758377
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: fa530e1c250a12c4d88412795b5d8fa2
timeCreated: 1537206611
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 1
mipBias: -1
wrapMode: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Android
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

@@ -0,0 +1,121 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Audio
{
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
using Opsive.UltimateCharacterController.Audio;
using System;
using System.Collections.Generic;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
/// <summary>
/// Draws a user friendly inspector for the AudioClipSet class.
/// </summary>
public static class AudioClipSetInspector
{
/// <summary>
/// Draws the AudioClipSet.
/// </summary>
public static ReorderableList DrawAudioClipSet(AudioClipSet audioClipSet, SerializedProperty serializedProperty, ReorderableList reorderableList, ReorderableList.ElementCallbackDelegate drawElementCallback,
ReorderableList.AddCallbackDelegate addCallback, ReorderableList.RemoveCallbackDelegate removeCallback)
{
if (serializedProperty != null) {
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(serializedProperty.FindPropertyRelative("m_Delay"));
if (EditorGUI.EndChangeCheck()) {
serializedProperty.serializedObject.ApplyModifiedProperties();
}
} else {
audioClipSet.Delay = EditorGUILayout.FloatField("Audio Delay", audioClipSet.Delay);
}
if (reorderableList == null || audioClipSet.AudioClips != reorderableList.list) {
if (audioClipSet.AudioClips == null) {
audioClipSet.AudioClips = new AudioClip[0];
}
reorderableList = new ReorderableList(audioClipSet.AudioClips, typeof(AudioClip), true, true, true, true);
reorderableList.drawHeaderCallback = OnAudioClipListHeaderDraw;
reorderableList.drawElementCallback = drawElementCallback;
reorderableList.onAddCallback = addCallback;
reorderableList.onRemoveCallback = removeCallback;
}
// ReorderableLists do not like indentation.
var indentLevel = EditorGUI.indentLevel;
while (EditorGUI.indentLevel > 0) {
EditorGUI.indentLevel--;
}
var listRect = GUILayoutUtility.GetRect(0, reorderableList.GetHeight());
// Indent the list so it lines up with the rest of the content.
listRect.x += InspectorUtility.IndentWidth * indentLevel;
listRect.xMax -= InspectorUtility.IndentWidth * indentLevel;
reorderableList.DoList(listRect);
while (EditorGUI.indentLevel < indentLevel) {
EditorGUI.indentLevel++;
}
GUILayout.Space(5);
return reorderableList;
}
/// <summary>
/// Draws the header for the AudioClip list.
/// </summary>
private static void OnAudioClipListHeaderDraw(Rect rect)
{
EditorGUI.LabelField(rect, "Audio Clips");
}
/// <summary>
/// Draws the AudioClip element.
/// </summary>
public static void OnAudioClipDraw(ReorderableList list, Rect rect, int index, AudioClipSet audioClipSet, UnityEngine.Object target)
{
EditorGUI.BeginChangeCheck();
rect.y += 2;
rect.height -= 5;
try {
audioClipSet.AudioClips[index] = (AudioClip)EditorGUI.ObjectField(rect, audioClipSet.AudioClips[index], typeof(AudioClip), false);
if (EditorGUI.EndChangeCheck() && target != null) {
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
}
} catch (Exception /*e*/) { }
}
/// <summary>
/// Adds a new AudioClip element to the AudioClipSet.
/// </summary>
public static void OnAudioClipListAdd(ReorderableList list, AudioClipSet audioClipSet, UnityEngine.Object target)
{
var audioClips = audioClipSet.AudioClips;
if (audioClips == null) {
audioClips = new AudioClip[1];
} else {
Array.Resize(ref audioClips, audioClips.Length + 1);
}
list.list = audioClipSet.AudioClips = audioClips;
if (target != null) {
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
}
}
/// <summary>
/// Remove the AudioClip element at the list index.
/// </summary>
public static void OnAudioClipListRemove(ReorderableList list, AudioClipSet audioClipSet, UnityEngine.Object target)
{
var audioClipList = new List<AudioClip>(audioClipSet.AudioClips);
audioClipList.RemoveAt(list.index);
list.list = audioClipSet.AudioClips = audioClipList.ToArray();
list.index = list.index - 1;
if (target != null) {
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 7727d057392875c4e8d2c0fa57437f37
timeCreated: 1511571871
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -0,0 +1,582 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Camera
{
using Opsive.UltimateCharacterController.Camera;
using Opsive.UltimateCharacterController.Camera.ViewTypes;
using Opsive.UltimateCharacterController.Utility;
using Opsive.UltimateCharacterController.Utility.Builders;
using Opsive.UltimateCharacterController.StateSystem;
using Opsive.UltimateCharacterController.Editor.Inspectors.StateSystem;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
/// <summary>
/// Shows a custom inspector for the CameraController.
/// </summary>
[CustomEditor(typeof(CameraController))]
public class CameraControllerInspector : StateBehaviorInspector
{
private const string c_EditorPrefsSelectedViewTypeIndexKey = "Opsive.UltimateCharacterController.Editor.Inspectors.Camera.SelectedViewTypeIndex";
private const string c_EditorPrefsSelectedViewTypeStateIndexKey = "Opsive.UltimateCharacterController.Editor.Inspectors.Camera.SelectedViewTypeStateIndex";
private string SelectedViewTypeIndexKey { get { return c_EditorPrefsSelectedViewTypeIndexKey + "." + target.GetType() + "." + target.name; } }
private string[] m_FirstPersonViewTypeNames;
private string[] m_ThirdPersonViewTypeNames;
private Type[] m_FirstPersonViewTypes;
private Type[] m_ThirdPersonViewTypes;
private CameraController m_CameraController;
private ReorderableList m_ReorderableViewTypeList;
private ReorderableList m_ReorderableViewTypeStateList;
/// <summary>
/// Search for the available view types types.
/// </summary>
protected override void OnEnable()
{
m_CameraController = target as CameraController;
// After an undo or redo has been performed the view types need to be deserialized.
Undo.undoRedoPerformed += OnUndoRedo;
try {
// The view types may have changed since the last serialization (such as if a class no longer exists) so serialize the objects
// again if there is a change.
if (m_CameraController.ViewTypes == null && m_CameraController.DeserializeViewTypes()) {
// Do not serialize the view type during runtime.
if (!Application.isPlaying) {
SerializeViewTypes();
}
}
} catch (Exception) { }
UpdateDefaultViewTypes();
}
/// <summary>
/// Perform any cleanup when the inspector has been disabled.
/// </summary>
private void OnDisable()
{
Undo.undoRedoPerformed -= OnUndoRedo;
}
/// <summary>
/// Returns the actions to draw before the State list is drawn.
/// </summary>
/// <returns>The actions to draw before the State list is drawn.</returns>
protected override Action GetDrawCallback()
{
var baseCallback = base.GetDrawCallback();
baseCallback += () =>
{
if (Foldout("Character")) {
EditorGUI.indentLevel++;
var initOnAwake = PropertyFromName("m_InitCharacterOnAwake");
EditorGUILayout.PropertyField(initOnAwake);
if (initOnAwake.boolValue || Application.isPlaying) {
var characterProperty = PropertyFromName("m_Character");
EditorGUILayout.PropertyField(characterProperty);
if (!Application.isPlaying && characterProperty.objectReferenceValue != null) {
if (!string.IsNullOrEmpty(AssetDatabase.GetAssetPath(characterProperty.objectReferenceValue))) {
EditorGUILayout.HelpBox("The Camera Controller Character property cannot point to a prefab.", MessageType.Error);
}
}
}
var autoAnchorProperty = PropertyFromName("m_AutoAnchor");
EditorGUILayout.PropertyField(autoAnchorProperty);
if (autoAnchorProperty.boolValue) {
EditorGUILayout.PropertyField(PropertyFromName("m_AutoAnchorBone"));
} else {
var anchorProperty = PropertyFromName("m_Anchor");
anchorProperty.objectReferenceValue = EditorGUILayout.ObjectField("Anchor", anchorProperty.objectReferenceValue, typeof(Transform), true, GUILayout.MinWidth(80)) as Transform;
if (anchorProperty.objectReferenceValue == null) {
EditorGUILayout.HelpBox("The anchor specifies the Transform that the camera should follow. If null it will use the Character's Transform.", MessageType.Info);
}
}
EditorGUILayout.PropertyField(PropertyFromName("m_AnchorOffset"));
EditorGUI.indentLevel--;
}
if (Foldout("View Types")) {
EditorGUILayout.BeginVertical("Box");
EditorGUI.indentLevel++;
// Only show the first/third person view type popup if that view type is available.
if (!string.IsNullOrEmpty(m_CameraController.FirstPersonViewTypeFullName) && !string.IsNullOrEmpty(m_CameraController.ThirdPersonViewTypeFullName)) {
var selectedIndex = 0;
for (int i = 0; i < m_FirstPersonViewTypes.Length; ++i) {
if (m_FirstPersonViewTypes[i].FullName == m_CameraController.FirstPersonViewTypeFullName) {
selectedIndex = i;
break;
}
}
var index = EditorGUILayout.Popup("First Person View Type", selectedIndex, m_FirstPersonViewTypeNames);
if (index != selectedIndex) {
m_CameraController.FirstPersonViewTypeFullName = PropertyFromName("m_FirstPersonViewTypeFullName").stringValue = m_FirstPersonViewTypes[index].FullName;
// Update the default view type if the current view type is first person. Do not update when playing because the first person property will update the current type.
if (Application.isPlaying && m_CameraController.ActiveViewType.FirstPersonPerspective) {
m_CameraController.ViewTypeFullName = m_CameraController.FirstPersonViewTypeFullName;
}
serializedObject.ApplyModifiedProperties();
}
for (int i = 0; i < m_ThirdPersonViewTypes.Length; ++i) {
if (m_ThirdPersonViewTypes[i].FullName == m_CameraController.ThirdPersonViewTypeFullName) {
selectedIndex = i;
break;
}
}
index = EditorGUILayout.Popup("Third Person View Type", selectedIndex, m_ThirdPersonViewTypeNames);
if (index != selectedIndex) {
m_CameraController.ThirdPersonViewTypeFullName = PropertyFromName("m_ThirdPersonViewTypeFullName").stringValue = m_ThirdPersonViewTypes[index].FullName;
// Update the default view type if the current view type is third person. Do not update when playing because the third person property will update the current type.
if (!Application.isPlaying && !m_CameraController.ActiveViewType.FirstPersonPerspective) {
m_CameraController.ViewTypeFullName = m_CameraController.ThirdPersonViewTypeFullName;
}
serializedObject.ApplyModifiedProperties();
}
EditorGUILayout.PropertyField(PropertyFromName("m_CanChangePerspectives"));
}
ReorderableListSerializationHelper.DrawReorderableList(ref m_ReorderableViewTypeList, this, m_CameraController.ViewTypes, "m_ViewTypeData",
OnViewTypeListDrawHeader, OnViewTypeListDraw, OnViewTypeListReorder, OnViewTypeListAdd,
OnViewTypeListRemove, OnViewTypeListSelect, DrawSelectedViewType, SelectedViewTypeIndexKey, true, true);
EditorGUI.indentLevel--;
EditorGUILayout.EndVertical();
}
if (Foldout("Zoom")) {
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(PropertyFromName("m_CanZoom"));
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PropertyField(PropertyFromName("m_ZoomState"));
GUILayout.Space(-5);
GUI.enabled = !string.IsNullOrEmpty(PropertyFromName("m_ZoomState").stringValue);
var appendItemIdentifierNameProperty = PropertyFromName("m_StateAppendItemIdentifierName");
appendItemIdentifierNameProperty.boolValue = EditorGUILayout.ToggleLeft(new GUIContent("Append Item", "Should the ItemIdentifier name be appened to the state name?"),
appendItemIdentifierNameProperty.boolValue, GUILayout.Width(110));
GUI.enabled = true;
EditorGUILayout.EndHorizontal();
EditorGUI.indentLevel--;
}
if (Foldout("Events")) {
EditorGUI.indentLevel++;
InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnChangeViewTypesEvent"));
InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnChangePerspectivesEvent"));
InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnZoomEvent"));
EditorGUI.indentLevel--;
}
};
return baseCallback;
}
/// <summary>
/// Draws the header for the view type list.
/// </summary>
private void OnViewTypeListDrawHeader(Rect rect)
{
var activeRect = rect;
activeRect.width -= 33;
EditorGUI.LabelField(activeRect, "View Type");
activeRect.x += activeRect.width - 12;
activeRect.width = 49;
EditorGUI.LabelField(activeRect, "Active");
}
/// <summary>
/// Draws all of the added view types.
/// </summary>
private void OnViewTypeListDraw(Rect rect, int index, bool isActive, bool isFocused)
{
// The index may be out of range if the component was copied.
if (index >= m_CameraController.ViewTypes.Length) {
m_ReorderableViewTypeList.index = -1;
EditorPrefs.SetInt(SelectedViewTypeIndexKey, m_ReorderableViewTypeList.index);
return;
}
var viewType = m_CameraController.ViewTypes[index];
if (viewType == null) {
var viewTypes = new List<ViewType>(m_CameraController.ViewTypes);
viewTypes.RemoveAt(index);
m_CameraController.ViewTypes = viewTypes.ToArray();
SerializeViewTypes();
return;
}
var label = InspectorUtility.DisplayTypeName(viewType.GetType(), true);
// Reduce the rect width so the active toggle can be added.
var activeRect = rect;
activeRect.width -= 20;
EditorGUI.LabelField(activeRect, label);
// Draw the active toggle and serialize if there is a change.
if (!(m_CameraController.ViewTypes[index] is UltimateCharacterController.Camera.ViewTypes.Transition)) {
EditorGUI.BeginChangeCheck();
activeRect = rect;
activeRect.x += activeRect.width - 32;
activeRect.width = 20;
EditorGUI.Toggle(activeRect, m_CameraController.ViewTypeFullName == viewType.GetType().FullName, EditorStyles.radioButton);
if (EditorGUI.EndChangeCheck()) {
m_CameraController.ViewTypeFullName = PropertyFromName("m_ViewTypeFullName").stringValue = viewType.GetType().FullName;
if (m_CameraController.ViewTypes[index].FirstPersonPerspective) {
m_CameraController.FirstPersonViewTypeFullName = PropertyFromName("m_FirstPersonViewTypeFullName").stringValue = m_CameraController.ViewTypeFullName;
} else {
m_CameraController.ThirdPersonViewTypeFullName = PropertyFromName("m_ThirdPersonViewTypeFullName").stringValue = m_CameraController.ViewTypeFullName;
}
serializedObject.ApplyModifiedProperties();
}
}
}
/// <summary>
/// The view type list has been reordered.
/// </summary>
private void OnViewTypeListReorder(ReorderableList list)
{
// Deserialize the view types so the ViewType array will be correct. The list operates on the ViewTypeData array.
m_CameraController.DeserializeViewTypes(true);
// Update the selected index.
EditorPrefs.SetInt(SelectedViewTypeIndexKey, list.index);
}
/// <summary>
/// Adds a new view type element to the list.
/// </summary>
private void OnViewTypeListAdd(ReorderableList list)
{
ReorderableListSerializationHelper.AddObjectType(typeof(ViewType), true, m_CameraController.ViewTypes, AddViewType);
}
/// <summary>
/// Adds the view type with the specified type.
/// </summary>
private void AddViewType(object obj)
{
var viewType = ViewTypeBuilder.AddViewType(m_CameraController, obj as Type);
m_ReorderableViewTypeList.displayRemove = m_CameraController.ViewTypes.Length > 1;
// Select the newly added view type.
m_ReorderableViewTypeList.index = m_CameraController.ViewTypes.Length - 1;
EditorPrefs.SetInt(SelectedViewTypeIndexKey, m_ReorderableViewTypeList.index);
// The view type's state list should start out fresh to prevent the old view type states from being shown.
m_ReorderableViewTypeStateList = null;
// Allow the view type to perform any initialization.
var inspectorDrawer = InspectorDrawerUtility.InspectorDrawerForType(viewType.GetType()) as ViewTypeInspectorDrawer;
if (inspectorDrawer != null) {
inspectorDrawer.ViewTypeAdded(viewType, target);
}
}
/// <summary>
/// Remove the view type at the list index.
/// </summary>
private void OnViewTypeListRemove(ReorderableList list)
{
var viewTypes = new List<ViewType>(m_CameraController.ViewTypes);
// Select a new view type if the currently selected view type is being removed.
var removedSelected = viewTypes[list.index].GetType().FullName == m_CameraController.ViewTypeFullName;
var viewTypeFullName = viewTypes[list.index].GetType().FullName;
// Remove the element.
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
// Allow the ability to perform any destruction.
var viewType = viewTypes[list.index];
var inspectorDrawer = InspectorDrawerUtility.InspectorDrawerForType(viewType.GetType()) as ViewTypeInspectorDrawer;
if (inspectorDrawer != null) {
inspectorDrawer.ViewTypeRemoved(viewType, target);
}
viewTypes.RemoveAt(list.index);
m_CameraController.ViewTypes = viewTypes.ToArray();
// Update the default first/third view type.
if (m_CameraController.FirstPersonViewTypeFullName == viewTypeFullName) {
m_CameraController.FirstPersonViewTypeFullName = string.Empty;
UpdateDefaultViewTypes();
} else if (m_CameraController.ThirdPersonViewTypeFullName == viewTypeFullName) {
m_CameraController.ThirdPersonViewTypeFullName = string.Empty;
UpdateDefaultViewTypes();
}
SerializeViewTypes();
// Don't show the remove button if there is only one view type left.
list.displayRemove = m_CameraController.ViewTypes.Length > 1;
// Update the index to point to no longer point to the now deleted view type.
list.index = list.index - 1;
if (list.index == -1 && viewTypes.Count > 0) {
list.index = 0;
}
if (removedSelected) {
m_CameraController.ViewTypeFullName = viewTypes[list.index].GetType().FullName;
}
EditorPrefs.SetInt(SelectedViewTypeIndexKey, list.index);
// The view type's state list should start out fresh to prevent the old view type states from being shown.
m_ReorderableViewTypeStateList = null;
}
/// <summary>
/// A new element has been selected within the list.
/// </summary>
private void OnViewTypeListSelect(ReorderableList list)
{
EditorPrefs.SetInt(SelectedViewTypeIndexKey, list.index);
// The view type's state list should start out fresh so a reference doesn't have to be cached for each view type.
m_ReorderableViewTypeStateList = null;
}
/// <summary>
/// Draws the specified view type.
/// </summary>
private void DrawSelectedViewType(int index)
{
var viewType = m_CameraController.ViewTypes[index];
InspectorUtility.DrawObject(viewType, true, true, target, true, SerializeViewTypes);
if (InspectorUtility.Foldout(viewType, new GUIContent("States"), false)) {
// The View Type class derives from system.object at the base level and reorderable lists can only operate on Unity objects. To get around this restriction
// create a dummy array within a Unity object that corresponds to the number of elements within the view type's state list. When the reorderable list is drawn
// the view type object will be used so it's like the dummy object never existed.
var selectedViewType = viewType as ViewType;
var gameObject = new GameObject();
var stateIndexHelper = gameObject.AddComponent<StateInspectorHelper>();
stateIndexHelper.StateIndexData = new int[selectedViewType.States.Length];
for (int i = 0; i < stateIndexHelper.StateIndexData.Length; ++i) {
stateIndexHelper.StateIndexData[i] = i;
}
var stateIndexSerializedObject = new SerializedObject(stateIndexHelper);
m_ReorderableViewTypeStateList = StateInspector.DrawStates(m_ReorderableViewTypeStateList, serializedObject, stateIndexSerializedObject.FindProperty("m_StateIndexData"),
GetSelectedViewTypeStateIndexKey(selectedViewType), OnViewTypeStateListDraw, OnViewTypeStateListAdd, OnViewTypeStateListReorder,
OnViewTypeStateListRemove);
DestroyImmediate(gameObject);
}
}
/// <summary>
/// Returns the state index key for the specified view type.
/// </summary>
private string GetSelectedViewTypeStateIndexKey(ViewType viewType)
{
return c_EditorPrefsSelectedViewTypeStateIndexKey + "." + target.GetType() + "." + target.name + "." + viewType.GetType();
}
/// <summary>
/// Draws all of the added states.
/// </summary>
private void OnViewTypeStateListDraw(Rect rect, int index, bool isActive, bool isFocused)
{
if (m_ReorderableViewTypeStateList == null) {
return;
}
var viewType = m_CameraController.ViewTypes[EditorPrefs.GetInt(SelectedViewTypeIndexKey)];
// The index may be out of range if the component was copied.
if (index >= m_CameraController.ViewTypes[EditorPrefs.GetInt(SelectedViewTypeIndexKey)].States.Length) {
m_ReorderableViewTypeStateList.index = -1;
EditorPrefs.SetInt(GetSelectedViewTypeStateIndexKey(viewType), m_ReorderableViewTypeStateList.index);
return;
}
EditorGUI.BeginChangeCheck();
StateInspector.OnStateListDraw(viewType, viewType.States, rect, index);
if (EditorGUI.EndChangeCheck()) {
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
SerializeViewTypes();
StateInspector.UpdateDefaultStateValues(viewType.States);
}
}
/// <summary>
/// Adds a new state element to the list.
/// </summary>
private void OnViewTypeStateListAdd(ReorderableList list)
{
StateInspector.OnStateListAdd(AddExistingViewTypePreset, CreateViewTypePreset);
}
/// <summary>
/// Adds a new element to the state list which uses an existing preset.
/// </summary>
private void AddExistingViewTypePreset()
{
var viewType = m_CameraController.ViewTypes[EditorPrefs.GetInt(SelectedViewTypeIndexKey)];
var states = StateInspector.AddExistingPreset(viewType.GetType(), viewType.States, m_ReorderableViewTypeStateList, GetSelectedViewTypeStateIndexKey(viewType));
if (viewType.States.Length != states.Length) {
InspectorUtility.SynchronizePropertyCount(states, m_ReorderableViewTypeStateList.serializedProperty);
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
viewType.States = states;
SerializeViewTypes();
}
}
/// <summary>
/// Creates a new preset and adds it to a new state in the list.
/// </summary>
private void CreateViewTypePreset()
{
var viewType = m_CameraController.ViewTypes[EditorPrefs.GetInt(SelectedViewTypeIndexKey)];
var states = StateInspector.CreatePreset(viewType, viewType.States, m_ReorderableViewTypeStateList, GetSelectedViewTypeStateIndexKey(viewType));
if (viewType.States.Length != states.Length) {
InspectorUtility.SynchronizePropertyCount(states, m_ReorderableViewTypeStateList.serializedProperty);
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
viewType.States = states;
SerializeViewTypes();
}
}
/// <summary>
/// The list has been reordered. Ensure the reorder is valid.
/// </summary>
private void OnViewTypeStateListReorder(ReorderableList list)
{
var viewType = m_CameraController.ViewTypes[EditorPrefs.GetInt(SelectedViewTypeIndexKey)];
// Use the dummy array in order to determine what element the selected index was swapped with.
var copiedStates = new UltimateCharacterController.StateSystem.State[viewType.States.Length];
Array.Copy(viewType.States, copiedStates, viewType.States.Length);
for (int i = 0; i < viewType.States.Length; ++i) {
var element = list.serializedProperty.GetArrayElementAtIndex(i);
if (element.intValue != i) {
viewType.States[i] = copiedStates[element.intValue];
element.intValue = i;
}
}
var states = StateInspector.OnStateListReorder(viewType.States);
if (viewType.States.Length != states.Length) {
InspectorUtility.SynchronizePropertyCount(states, m_ReorderableViewTypeStateList.serializedProperty);
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
viewType.States = states;
SerializeViewTypes();
}
}
/// <summary>
/// The ReordableList remove button has been pressed. Remove the selected state.
/// </summary>
private void OnViewTypeStateListRemove(ReorderableList list)
{
var viewType = m_CameraController.ViewTypes[EditorPrefs.GetInt(SelectedViewTypeIndexKey)];
var states = StateInspector.OnStateListRemove(viewType.States, GetSelectedViewTypeStateIndexKey(viewType), list);
if (viewType.States.Length != states.Length) {
InspectorUtility.SynchronizePropertyCount(states, m_ReorderableViewTypeStateList.serializedProperty);
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
viewType.States = states;
SerializeViewTypes();
}
}
/// <summary>
/// Serialize all of the view tyoes to the ViewTypeData array.
/// </summary>
private void SerializeViewTypes()
{
ViewTypeBuilder.SerializeViewTypes(m_CameraController);
// Update the default first and third person view types based off of the new view type list.
UpdateDefaultViewTypes();
InspectorUtility.SetDirty(target);
}
/// <summary>
/// Updates the default first/third view type based on the view types availabe on the camera controller.
/// </summary>
private void UpdateDefaultViewTypes()
{
// The view type may not exist anymore.
if (UnityEngineUtility.GetType(m_CameraController.FirstPersonViewTypeFullName) == null) {
m_CameraController.FirstPersonViewTypeFullName = string.Empty;
InspectorUtility.SetDirty(target);
}
if (UnityEngineUtility.GetType(m_CameraController.ThirdPersonViewTypeFullName) == null) {
m_CameraController.ThirdPersonViewTypeFullName = string.Empty;
InspectorUtility.SetDirty(target);
}
var hasSelectedViewType = false;
var firstPersonViewTypes = new List<Type>();
var thirdPersonViewTypes = new List<Type>();
var firstPersonViewTypeNames = new List<string>();
var thirdPersonViewTypeNames = new List<string>();
var viewTypes = m_CameraController.ViewTypes;
if (viewTypes != null) {
for (int i = 0; i < viewTypes.Length; ++i) {
if (viewTypes[i] == null) {
continue;
}
// Transition view types are not limited to one perspective.
if (viewTypes[i] is UltimateCharacterController.Camera.ViewTypes.Transition) {
continue;
}
if (viewTypes[i].FirstPersonPerspective) {
// Use the view type if the type is currently empty.
if (string.IsNullOrEmpty(m_CameraController.FirstPersonViewTypeFullName)) {
m_CameraController.FirstPersonViewTypeFullName = viewTypes[i].GetType().FullName;
}
firstPersonViewTypes.Add(viewTypes[i].GetType());
firstPersonViewTypeNames.Add(InspectorUtility.DisplayTypeName(viewTypes[i].GetType(), false));
} else { // Third Person.
// Use the view type if the type is currently empty.
if (string.IsNullOrEmpty(m_CameraController.ThirdPersonViewTypeFullName)) {
m_CameraController.ThirdPersonViewTypeFullName = viewTypes[i].GetType().FullName;
}
thirdPersonViewTypes.Add(viewTypes[i].GetType());
thirdPersonViewTypeNames.Add(InspectorUtility.DisplayTypeName(viewTypes[i].GetType(), false));
}
if (m_CameraController.ViewTypeFullName == viewTypes[i].GetType().FullName) {
hasSelectedViewType = true;
}
}
}
m_FirstPersonViewTypes = firstPersonViewTypes.ToArray();
m_ThirdPersonViewTypes = thirdPersonViewTypes.ToArray();
m_FirstPersonViewTypeNames = firstPersonViewTypeNames.ToArray();
m_ThirdPersonViewTypeNames = thirdPersonViewTypeNames.ToArray();
// If the selected ViewType no longer exists in the list then select the next view type.
if (!hasSelectedViewType) {
m_CameraController.ViewTypeFullName = string.Empty;
if (viewTypes != null && viewTypes.Length > 0) {
for (int i = 0; i < viewTypes.Length; ++i) {
// Transition ViewTypes cannot be selected.
if (viewTypes[i] is UltimateCharacterController.Camera.ViewTypes.Transition) {
continue;
}
m_CameraController.ViewTypeFullName = viewTypes[i].GetType().FullName;
break;
}
}
}
}
/// <summary>
/// Deserialize the view tpes after an undo/redo.
/// </summary>
private void OnUndoRedo()
{
m_CameraController.DeserializeViewTypes(true);
Repaint();
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 4f867b66ddbd5074ba7fbf48968ec8b9
timeCreated: 1484437660
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -0,0 +1,43 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Camera
{
using Opsive.UltimateCharacterController.Camera.ViewTypes;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the base Ability type.
/// </summary>
[InspectorDrawer(typeof(ViewType))]
public class ViewTypeInspectorDrawer : InspectorDrawer
{
/// <summary>
/// Called when the object should be drawn to the inspector.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
public override void OnInspectorGUI(object target, Object parent)
{
ObjectInspector.DrawFields(target, true);
}
/// <summary>
/// The ability has been added to the camera. Perform any initialization.
/// </summary>
/// <param name="viewType">The view type that has been added.</param>
/// <param name="parent">The parent of the added ability.</param>
public virtual void ViewTypeAdded(ViewType viewType, Object parent) { }
/// <summary>
/// The view type has been removed from the camera. Perform any destruction.
/// </summary>
/// <param name="viewType">The view type that has been removed.</param>
/// <param name="parent">The parent of the removed ability.</param>
public virtual void ViewTypeRemoved(ViewType viewType, Object parent) { }
}
}

View File

@@ -0,0 +1,13 @@
fileFormatVersion: 2
guid: 5013b5f50c911d0469b5c18d0bacad7e
timeCreated: 1554164623
licenseType: Pro
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

@@ -0,0 +1,397 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character
{
using Opsive.UltimateCharacterController.Character.Abilities;
using Opsive.UltimateCharacterController.Character.Abilities.Starters;
using Opsive.UltimateCharacterController.Traits;
using Opsive.UltimateCharacterController.Editor.Inspectors.Audio;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using Opsive.UltimateCharacterController.Editor.Utility;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
/// <summary>
/// Draws a custom inspector for the base Ability type.
/// </summary>
[InspectorDrawer(typeof(Ability))]
public class AbilityInspectorDrawer : InspectorDrawer
{
private Ability m_Ability;
private ReorderableList m_ReorderableStartAudioClipsList;
private ReorderableList m_ReorderableStopAudioClipsList;
private static List<System.Type> s_AbilityStarterTypeCache;
private static List<string> s_AbilityStarterTypeName;
/// <summary>
/// Called when the object should be drawn to the inspector.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
public override void OnInspectorGUI(object target, Object parent)
{
m_Ability = (target as Ability);
DrawInputFieldsFields(target, parent);
InspectorUtility.DrawAttributeModifier((parent as Component).GetComponent<AttributeManager>(), (target as Ability).AttributeModifier, "Attribute Name");
EditorGUILayout.BeginHorizontal();
InspectorUtility.DrawField(target, "m_State");
GUI.enabled = !string.IsNullOrEmpty(InspectorUtility.GetFieldValue<string>(target, "m_State"));
// The InspectorUtility doesn't support a toggle with the text on the right.
var field = InspectorUtility.GetField(target, "m_StateAppendItemIdentifierName");
GUILayout.Space(-5);
var value = EditorGUILayout.ToggleLeft(new GUIContent("Append Item", InspectorUtility.GetFieldTooltip(field)), (bool)field.GetValue(target), GUILayout.Width(110));
InspectorUtility.SetFieldValue(target, "m_StateAppendItemIdentifierName", value);
GUI.enabled = true;
EditorGUILayout.EndHorizontal();
InspectorUtility.DrawField(target, "m_AbilityIndexParameter");
DrawInspectorDrawerFields(target, parent);
if (InspectorUtility.Foldout(target, "Audio")) {
EditorGUI.indentLevel++;
if (InspectorUtility.Foldout(target, "Start")) {
EditorGUI.indentLevel++;
m_ReorderableStartAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_Ability.StartAudioClipSet, null, m_ReorderableStartAudioClipsList, OnStartAudioClipDraw, OnStartAudioClipListAdd, OnStartAudioClipListRemove);
EditorGUI.indentLevel--;
}
DrawAudioFields();
if (InspectorUtility.Foldout(target, "Stop")) {
EditorGUI.indentLevel++;
m_ReorderableStopAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_Ability.StopAudioClipSet, null, m_ReorderableStopAudioClipsList, OnStopAudioClipDraw, OnStopAudioClipListAdd, OnStopAudioClipListRemove);
EditorGUI.indentLevel--;
}
EditorGUI.indentLevel--;
}
var startEffectValue = InspectorUtility.GetFieldValue<string>(target, "m_StartEffectName");
var newStartEffectValue = InspectorUtility.DrawTypePopup(typeof(UltimateCharacterController.Character.Effects.Effect), startEffectValue, "Start Effect", true);
if (startEffectValue != newStartEffectValue) {
InspectorUtility.SetFieldValue(target, "m_StartEffectName", newStartEffectValue);
InspectorUtility.SetDirty(parent);
}
if (!string.IsNullOrEmpty(newStartEffectValue)) {
EditorGUI.indentLevel++;
InspectorUtility.DrawField(target, "m_StartEffectIndex");
EditorGUI.indentLevel--;
}
if (InspectorUtility.Foldout(target, "General")) {
EditorGUI.indentLevel++;
InspectorUtility.DrawField(target, "m_InspectorDescription");
GUI.enabled = !(target is MoveTowards);
InspectorUtility.DrawField(target, "m_AllowPositionalInput");
InspectorUtility.DrawField(target, "m_AllowRotationalInput");
GUI.enabled = true;
InspectorUtility.DrawField(target, "m_UseGravity");
InspectorUtility.DrawField(target, "m_UseRootMotionPosition");
InspectorUtility.DrawField(target, "m_UseRootMotionRotation");
InspectorUtility.DrawField(target, "m_DetectHorizontalCollisions");
InspectorUtility.DrawField(target, "m_DetectVerticalCollisions");
InspectorUtility.DrawField(target, "m_AnimatorMotion");
var itemAbilityMoveTowards = (target is MoveTowards) || (target is UltimateCharacterController.Character.Abilities.Items.ItemAbility);
GUI.enabled = !itemAbilityMoveTowards;
var inventory = (parent as Component).GetComponent<UltimateCharacterController.Inventory.InventoryBase>();
if (inventory != null && (parent as Component).GetComponent<UltimateCharacterController.Inventory.ItemSetManagerBase>() != null) {
var slotCount = inventory.SlotCount;
if (InspectorUtility.Foldout(target, "Allow Equipped Items")) {
EditorGUI.indentLevel++;
var mask = InspectorUtility.GetFieldValue<int>(target, "m_AllowEquippedSlotsMask");
var newMask = 0;
for (int i = 0; i < slotCount; ++i) {
var enabled = (mask & (1 << i)) == (1 << i);
if (EditorGUILayout.Toggle("Slot " + i, enabled)) {
newMask |= 1 << i;
}
}
// If all of the slots are enabled then use -1.
if (newMask == (1 << slotCount) - 1 || itemAbilityMoveTowards) {
newMask = -1;
}
if (mask != newMask) {
InspectorUtility.SetFieldValue(target, "m_AllowEquippedSlotsMask", newMask);
}
InspectorUtility.DrawField(target, "m_AllowItemDefinitions");
InspectorUtility.DrawField(target, "m_ImmediateUnequip");
InspectorUtility.DrawField(target, "m_ReequipSlots");
if (itemAbilityMoveTowards && InspectorUtility.GetFieldValue<bool>(target, "m_ReequipSlots")) {
InspectorUtility.SetFieldValue(target, "m_ReequipSlots", false);
GUI.changed = true;
}
EditorGUI.indentLevel--;
}
}
GUI.enabled = true;
EditorGUI.indentLevel--;
}
if (InspectorUtility.Foldout(target, "UI")) {
EditorGUI.indentLevel++;
InspectorUtility.DrawField(target, "m_AbilityMessageText");
InspectorUtility.DrawField(target, "m_AbilityMessageIcon");
EditorGUI.indentLevel--;
}
}
/// <summary>
/// Draws the Ability fields related to input.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
protected void DrawInputFieldsFields(object target, Object parent)
{
var startTypeValue = (Ability.AbilityStartType)EditorGUILayout.EnumPopup(new GUIContent("Start Type", InspectorUtility.GetFieldTooltip(target, "m_StartType")), InspectorUtility.GetFieldValue<Ability.AbilityStartType>(target, "m_StartType"));
InspectorUtility.SetFieldValue(target, "m_StartType", startTypeValue);
if (startTypeValue == Ability.AbilityStartType.Custom) {
PopulateAbilityStarterTypes();
if (s_AbilityStarterTypeCache != null) {
EditorGUI.indentLevel++;
var selected = 0;
var forceUpdate = true;
if (m_Ability.StarterData != null && !string.IsNullOrEmpty(m_Ability.StarterData.ObjectType)) {
for (int i = 0; i < s_AbilityStarterTypeCache.Count; ++i) {
if (s_AbilityStarterTypeCache[i].FullName == m_Ability.StarterData.ObjectType) {
selected = i;
forceUpdate = false;
break;
}
}
}
var newSelected = EditorGUILayout.Popup("Starter", selected, s_AbilityStarterTypeName.ToArray());
if (newSelected != selected || forceUpdate) {
// Use the Sequence selector as the default (or recoil in the case of a melee weapon).
if (forceUpdate) {
for (int i = 0; i < s_AbilityStarterTypeCache.Count; ++i) {
if (s_AbilityStarterTypeCache[i].FullName == "Opsive.UltimateCharacterController.Character.Abilities.Starters.ComboTimeout") {
newSelected = i;
break;
}
}
GUI.changed = true;
}
var starter = System.Activator.CreateInstance(s_AbilityStarterTypeCache[newSelected]) as AbilityStarter;
m_Ability.StarterData = Shared.Utility.Serialization.Serialize(starter);
}
if (m_Ability.Starter != null) {
EditorGUI.indentLevel++;
InspectorUtility.DrawObject(m_Ability.Starter, false, true, parent, false, () =>
{
m_Ability.StarterData = Shared.Utility.Serialization.Serialize<AbilityStarter>(m_Ability.Starter);
});
EditorGUI.indentLevel--;
}
EditorGUI.indentLevel--;
}
} else if ((target as Ability).Starter != null) {
(target as Ability).StarterData = null;
}
var stopTypeValue = (Ability.AbilityStopType)EditorGUILayout.EnumPopup(new GUIContent("Stop Type", InspectorUtility.GetFieldTooltip(target, "m_StopType")), InspectorUtility.GetFieldValue<Ability.AbilityStopType>(target, "m_StopType"));
InspectorUtility.SetFieldValue(target, "m_StopType", stopTypeValue);
EditorGUI.indentLevel++;
// The input name field only needs to be shown if the start/stop type is set to a value which requires the button press.
if ((startTypeValue != Ability.AbilityStartType.Automatic && startTypeValue != Ability.AbilityStartType.Manual && startTypeValue != Ability.AbilityStartType.Custom) ||
(stopTypeValue != Ability.AbilityStopType.Automatic && stopTypeValue != Ability.AbilityStopType.Manual)) {
EditorGUI.BeginChangeCheck();
// Draw a custom array inspector for the input names.
var inputNames = InspectorUtility.GetFieldValue<string[]>(target, "m_InputNames");
if (inputNames == null || inputNames.Length == 0) {
inputNames = new string[1];
}
for (int i = 0; i < inputNames.Length; ++i) {
EditorGUILayout.BeginHorizontal();
var fieldName = " ";
if (i == 0) {
fieldName = "Input Name";
}
inputNames[i] = EditorGUILayout.TextField(new GUIContent(fieldName, InspectorUtility.GetFieldTooltip(target, "m_InputName")), inputNames[i]);
if (i == inputNames.Length - 1) {
if (i > 0 && GUILayout.Button(InspectorStyles.RemoveIcon, InspectorStyles.NoPaddingButtonStyle, GUILayout.Width(18))) {
System.Array.Resize(ref inputNames, inputNames.Length - 1);
}
if (GUILayout.Button(InspectorStyles.AddIcon, InspectorStyles.NoPaddingButtonStyle, GUILayout.Width(18))) {
System.Array.Resize(ref inputNames, inputNames.Length + 1);
inputNames[inputNames.Length - 1] = inputNames[inputNames.Length - 2];
}
}
EditorGUILayout.EndHorizontal();
}
if (EditorGUI.EndChangeCheck()) {
InspectorUtility.SetFieldValue(target, "m_InputNames", inputNames);
GUI.changed = true;
}
// Only show the duration and wait for release options with a LongPress start/stop type.
if (startTypeValue == Ability.AbilityStartType.LongPress || stopTypeValue == Ability.AbilityStopType.LongPress) {
var duration = EditorGUILayout.FloatField(new GUIContent("Long Press Duration", InspectorUtility.GetFieldTooltip(target, "m_LongPressDuration")), InspectorUtility.GetFieldValue<float>(target, "m_LongPressDuration"));
InspectorUtility.SetFieldValue(target, "m_LongPressDuration", duration);
var waitForRelease = EditorGUILayout.Toggle(new GUIContent("Wait For Long Press Release", InspectorUtility.GetFieldTooltip(target, "m_WaitForLongPressRelease")),
InspectorUtility.GetFieldValue<bool>(target, "m_WaitForLongPressRelease"));
InspectorUtility.SetFieldValue(target, "m_WaitForLongPressRelease", waitForRelease);
}
}
EditorGUI.indentLevel--;
}
/// <summary>
/// Searches for an adds any Effects available in the project.
/// </summary>
private static void PopulateAbilityStarterTypes()
{
if (s_AbilityStarterTypeCache != null) {
return;
}
s_AbilityStarterTypeCache = new List<System.Type>();
s_AbilityStarterTypeName = new List<string>();
var assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
for (int i = 0; i < assemblies.Length; ++i) {
var assemblyTypes = assemblies[i].GetTypes();
for (int j = 0; j < assemblyTypes.Length; ++j) {
// Must derive from AbilityStarter.
if (!typeof(AbilityStarter).IsAssignableFrom(assemblyTypes[j])) {
continue;
}
// Ignore abstract classes.
if (assemblyTypes[j].IsAbstract) {
continue;
}
s_AbilityStarterTypeCache.Add(assemblyTypes[j]);
s_AbilityStarterTypeName.Add(InspectorUtility.DisplayTypeName(assemblyTypes[j], false));
}
}
}
/// <summary>
/// Draws the fields related to the inspector drawer.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
protected virtual void DrawInspectorDrawerFields(object target, Object parent)
{
ObjectInspector.DrawFields(target, false);
}
/// <summary>
/// Draws the fields related to audio.
/// </summary>
protected virtual void DrawAudioFields() { }
/// <summary>
/// The ability has been added to the Ultimate Character Locomotion. Perform any initialization.
/// </summary>
/// <param name="ability">The ability that has been added.</param>
/// <param name="parent">The parent of the added ability.</param>
public virtual void AbilityAdded(Ability ability, Object parent) { }
/// <summary>
/// The ability has been removed from the Ultimate Character Locomotion. Perform any destruction.
/// </summary>
/// <param name="ability">The ability that has been removed.</param>
/// <param name="parent">The parent of the removed ability.</param>
public virtual void AbilityRemoved(Ability ability, Object parent) { }
/// <summary>
/// Allows abilities to draw custom controls under the "Editor" foldout of the ability inspector.
/// </summary>
/// <param name="ability">The ability whose editor controls are being retrieved.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
/// <returns>Any custom editor controls. Can be null.</returns>
public virtual System.Action GetEditorCallback(Ability ability, Object parent)
{
return null;
}
/// <summary>
/// Generates the code necessary to recreate the states/transitions that are affected by the ability.
/// </summary>
/// <param name="ability">The ability to generate the states/transitions for.</param>
/// <param name="animatorController">The Animator Controller to generate the states/transitions from.</param>
/// <param name="firstPersonAnimatorController">The first person Animator Controller to generate the states/transitions from.</param>
/// <param name="baseDirectory">The directory that the scripts are located.</param>
/// <returns>The file path of the generated code.</returns>
public string GenerateAnimatorCode(Ability ability, UnityEditor.Animations.AnimatorController animatorController, UnityEditor.Animations.AnimatorController firstPersonAnimatorController, string baseDirectory)
{
return AnimatorBuilder.GenerateAnimatorCode(animatorController, firstPersonAnimatorController, "AbilityIndex", ability.AbilityIndexParameter, ability, baseDirectory);
}
/// <summary>
/// Returns true if the ability can build to the animator.
/// </summary>
public virtual bool CanBuildAnimator { get { return false; } }
/// <summary>
/// Adds the abilities states/transitions to the animator.
/// </summary>
/// <param name="animatorController">The Animator Controller to add the states to.</param>
/// <param name="firstPersonAnimatorController">The first person Animator Controller to add the states to.</param>
public virtual void BuildAnimator(UnityEditor.Animations.AnimatorController animatorController, UnityEditor.Animations.AnimatorController firstPersonAnimatorController) { }
/// <summary>
/// Draws the AudioClip element.
/// </summary>
private void OnStartAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
{
AudioClipSetInspector.OnAudioClipDraw(m_ReorderableStartAudioClipsList, rect, index, m_Ability.StartAudioClipSet, null);
}
/// <summary>
/// Draws the AudioClip element.
/// </summary>
private void OnStopAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
{
AudioClipSetInspector.OnAudioClipDraw(m_ReorderableStartAudioClipsList, rect, index, m_Ability.StopAudioClipSet, null);
}
/// <summary>
/// Adds a new AudioClip element to the AudioClipSet.
/// </summary>
private void OnStartAudioClipListAdd(ReorderableList list)
{
AudioClipSetInspector.OnAudioClipListAdd(list, m_Ability.StartAudioClipSet, null);
}
/// <summary>
/// Adds a new AudioClip element to the AudioClipSet.
/// </summary>
private void OnStopAudioClipListAdd(ReorderableList list)
{
AudioClipSetInspector.OnAudioClipListAdd(list, m_Ability.StopAudioClipSet, null);
}
/// <summary>
/// Remove the AudioClip element at the list index.
/// </summary>
private void OnStartAudioClipListRemove(ReorderableList list)
{
AudioClipSetInspector.OnAudioClipListRemove(list, m_Ability.StartAudioClipSet, null);
m_Ability.StartAudioClipSet.AudioClips = (AudioClip[])list.list;
}
/// <summary>
/// Remove the AudioClip element at the list index.
/// </summary>
private void OnStopAudioClipListRemove(ReorderableList list)
{
AudioClipSetInspector.OnAudioClipListRemove(list, m_Ability.StopAudioClipSet, null);
m_Ability.StopAudioClipSet.AudioClips = (AudioClip[])list.list;
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b4c4a27ccb8d7cf4bbec4093c8102ce5
timeCreated: 1493387063
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,62 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character.Abilities
{
using Opsive.UltimateCharacterController.Character.Abilities;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using UnityEditor;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the DetectObjectAbilityBase ability.
/// </summary>
[InspectorDrawer(typeof(DetectObjectAbilityBase))]
public class DetectObjectAbilityBaseInspectorDrawer : AbilityInspectorDrawer
{
/// <summary>
/// Draws the fields related to the inspector drawer.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
protected override void DrawInspectorDrawerFields(object target, Object parent)
{
// Draw ObjectDetectionMode manually so it'll use the MaskField.
var objectDetection = (int)InspectorUtility.GetFieldValue<DetectObjectAbilityBase.ObjectDetectionMode>(target, "m_ObjectDetection");
var objectDetectionString = System.Enum.GetNames(typeof(DetectObjectAbilityBase.ObjectDetectionMode));
var value = EditorGUILayout.MaskField(new GUIContent("Object Detection", InspectorUtility.GetFieldTooltip(target, "m_ObjectDetection")), objectDetection, objectDetectionString);
if (value != objectDetection) {
InspectorUtility.SetFieldValue(target, "m_ObjectDetection", value);
}
// The ability may not use any detection.
if (value != 0) {
EditorGUI.indentLevel++;
InspectorUtility.DrawField(target, "m_DetectLayers");
InspectorUtility.DrawField(target, "m_UseLookPosition");
InspectorUtility.DrawField(target, "m_UseLookDirection");
InspectorUtility.DrawField(target, "m_AngleThreshold");
InspectorUtility.DrawField(target, "m_ObjectID");
var objectDetectionEnumValue = (DetectObjectAbilityBase.ObjectDetectionMode)value;
if (objectDetectionEnumValue != DetectObjectAbilityBase.ObjectDetectionMode.Trigger) {
InspectorUtility.DrawField(target, "m_CastDistance");
InspectorUtility.DrawField(target, "m_CastFrameInterval");
InspectorUtility.DrawField(target, "m_CastOffset");
InspectorUtility.DrawField(target, "m_TriggerInteraction");
if ((objectDetectionEnumValue & DetectObjectAbilityBase.ObjectDetectionMode.Spherecast) != 0) {
InspectorUtility.DrawField(target, "m_SpherecastRadius");
}
} else {
InspectorUtility.DrawField(target, "m_MaxTriggerObjectCount");
}
EditorGUI.indentLevel--;
}
base.DrawInspectorDrawerFields(target, parent);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: c2fefdefc093ddd46828db7cbfb10392
timeCreated: 1501512153
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -0,0 +1,38 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character.Abilities.Items
{
using Opsive.UltimateCharacterController.Character.Abilities.Items;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using UnityEditor;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the EquipUnequip ItemAbility.
/// </summary>
[InspectorDrawer(typeof(EquipUnequip))]
public class EquipUnequipInspectorDrawer : ItemSetAbilityBaseInspectorDrawer
{
/// <summary>
/// Draws the fields related to the inspector drawer.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
protected override void DrawInspectorDrawerFields(object target, Object parent)
{
// Draw AutoEquip manually so it'll use the MaskField.
var autoEquip = (int)InspectorUtility.GetFieldValue<EquipUnequip.AutoEquipType>(target, "m_AutoEquip");
var equipString = System.Enum.GetNames(typeof(EquipUnequip.AutoEquipType));
var value = EditorGUILayout.MaskField(new GUIContent("Auto Equip", InspectorUtility.GetFieldTooltip(target, "m_AutoEquip")), autoEquip, equipString);
if (value != autoEquip) {
InspectorUtility.SetFieldValue(target, "m_AutoEquip", value);
}
base.DrawInspectorDrawerFields(target, parent);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 7f26c63ae6882de419af2567d9ecc665
timeCreated: 1501512153
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,60 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character.Abilities.Items
{
using Opsive.Shared.Utility;
using Opsive.UltimateCharacterController.Character;
using Opsive.UltimateCharacterController.Character.Abilities.Items;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using Opsive.UltimateCharacterController.Inventory;
using UnityEditor;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the ItemSetAbilityBase ItemAbility.
/// </summary>
[InspectorDrawer(typeof(ItemSetAbilityBase))]
public class ItemSetAbilityBaseInspectorDrawer : AbilityInspectorDrawer
{
/// <summary>
/// Draws the fields related to the inspector drawer.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
protected override void DrawInspectorDrawerFields(object target, Object parent)
{
// ItemCollection must exist for the categories to be populated.
var itemSetManager = (parent as UltimateCharacterLocomotion).GetComponent<ItemSetManagerBase>();
if (itemSetManager == null) {
EditorGUILayout.HelpBox("The character must have the ItemSetManager component.", MessageType.Error);
return;
}
itemSetManager.Initialize(false);
if (itemSetManager.CategoryItemSets == null || itemSetManager.CategoryItemSets.Length == 0) {
return;
}
// Draw a popup with all of the ItemSet categories.
var categoryID = InspectorUtility.GetFieldValue<uint>(target, "m_ItemSetCategoryID");
var selected = -1;
var categoryNames = new string[itemSetManager.CategoryItemSets.Length];
for (int i = 0; i < categoryNames.Length; ++i) {
categoryNames[i] = itemSetManager.CategoryItemSets[i].CategoryName;
if (categoryID == itemSetManager.CategoryItemSets[i].CategoryID) {
selected = i;
}
}
var newSelected = EditorGUILayout.Popup("ItemSet Category", (selected != -1 ? selected : 0), categoryNames);
if (selected != newSelected || RandomID.IsIDEmpty(categoryID)) {
InspectorUtility.SetFieldValue(target, "m_ItemSetCategoryID", itemSetManager.CategoryItemSets[newSelected].CategoryID);
GUI.changed = true;
}
base.DrawInspectorDrawerFields(target, parent);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 48fbcbb3a33cbab4ab31f1eb446db9d4
timeCreated: 1501512153
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,102 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character.Abilities
{
using Opsive.UltimateCharacterController.Character.Abilities;
using Opsive.UltimateCharacterController.Editor.Inspectors.Audio;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the Jump Ability.
/// </summary>
[InspectorDrawer(typeof(Jump))]
public class JumpInspectorDrawer : AbilityInspectorDrawer
{
private Jump m_Jump;
private ReorderableList m_ReorderableAirborneJumpAudioClipsList;
/// <summary>
/// The ability has been added to the Ultimate Character Locomotion. Perform any initialization.
/// </summary>
/// <param name="ability">The ability that has been added.</param>
/// <param name="parent">The parent of the added ability.</param>
public override void AbilityAdded(Ability ability, Object parent)
{
base.AbilityAdded(ability, parent);
// The character should jump immediately if there is no animator.
var characterLocomotion = parent as UltimateCharacterController.Character.UltimateCharacterLocomotion;
var animator = characterLocomotion.GetComponent<Animator>();
if (animator == null) {
(ability as Jump).JumpEvent = new UltimateCharacterController.Utility.AnimationEventTrigger(false, 0);
}
}
/// <summary>
/// Draws the fields related to the inspector drawer.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
protected override void DrawInspectorDrawerFields(object target, Object parent)
{
m_Jump = target as Jump;
InspectorUtility.DrawField(target, "m_MinCeilingJumpHeight");
InspectorUtility.DrawField(target, "m_GroundedGracePeriod");
InspectorUtility.DrawField(target, "m_Force");
InspectorUtility.DrawField(target, "m_SidewaysForceMultiplier");
InspectorUtility.DrawField(target, "m_BackwardsForceMultiplier");
InspectorUtility.DrawField(target, "m_Frames");
InspectorUtility.DrawField(target, "m_JumpEvent");
InspectorUtility.DrawField(target, "m_JumpSurfaceImpact");
InspectorUtility.DrawField(target, "m_ForceHold");
InspectorUtility.DrawField(target, "m_ForceDampingHold");
InspectorUtility.DrawField(target, "m_MaxAirborneJumpCount");
if (m_Jump.MaxAirborneJumpCount > 0) {
EditorGUI.indentLevel++;
InspectorUtility.DrawField(target, "m_AirborneJumpForce");
InspectorUtility.DrawField(target, "m_AirborneJumpFrames");
if (InspectorUtility.Foldout(target, "Airborne Jump Audio")) {
EditorGUI.indentLevel++;
m_ReorderableAirborneJumpAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_Jump.AirborneJumpAudioClipSet, null, m_ReorderableAirborneJumpAudioClipsList, OnAirborneJumpAudioClipDraw, OnAirborneJumpAudioClipListAdd, OnAirborneJumpAudioClipListRemove);
EditorGUI.indentLevel--;
}
EditorGUI.indentLevel--;
}
InspectorUtility.DrawField(target, "m_VerticalVelocityStopThreshold");
InspectorUtility.DrawField(target, "m_RecurrenceDelay");
}
/// <summary>
/// Draws the AudioClip element.
/// </summary>
private void OnAirborneJumpAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
{
AudioClipSetInspector.OnAudioClipDraw(m_ReorderableAirborneJumpAudioClipsList, rect, index, m_Jump.AirborneJumpAudioClipSet, null);
}
/// <summary>
/// Adds a new AudioClip element to the AudioClipSet.
/// </summary>
private void OnAirborneJumpAudioClipListAdd(ReorderableList list)
{
AudioClipSetInspector.OnAudioClipListAdd(list, m_Jump.AirborneJumpAudioClipSet, null);
}
/// <summary>
/// Remove the AudioClip element at the list index.
/// </summary>
private void OnAirborneJumpAudioClipListRemove(ReorderableList list)
{
AudioClipSetInspector.OnAudioClipListRemove(list, m_Jump.AirborneJumpAudioClipSet, null);
m_Jump.AirborneJumpAudioClipSet.AudioClips = (AudioClip[])list.list;
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: e2ad0981c5c23f448a7eb359b97bf94b
timeCreated: 1506296478
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,216 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character.Abilities
{
using Opsive.UltimateCharacterController.Character.Abilities;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using Opsive.UltimateCharacterController.Game;
using Opsive.UltimateCharacterController.Items;
using System;
using System.Reflection;
using UnityEditor;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the Ragdoll Ability.
/// </summary>
[InspectorDrawer(typeof(Ragdoll))]
public class RagdollInspectorDrawer : AbilityInspectorDrawer
{
/// <summary>
/// Draws the fields related to the inspector drawer.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
protected override void DrawInspectorDrawerFields(object target, UnityEngine.Object parent)
{
InspectorUtility.DrawField(target, "m_StartOnDeath");
InspectorUtility.DrawField(target, "m_StartDelay");
var ragdollLayerFieldValue = InspectorUtility.GetFieldValue<int>(target, "m_RagdollLayer");
var value = EditorGUILayout.LayerField(new GUIContent("Ragdoll Layer", InspectorUtility.GetFieldTooltip(target, "m_RagdollLayer")), ragdollLayerFieldValue);
if (ragdollLayerFieldValue != value) {
InspectorUtility.SetFieldValue(target, "m_RagdollLayer", value);
}
ragdollLayerFieldValue = InspectorUtility.GetFieldValue<int>(target, "m_InactiveRagdollLayer");
value = EditorGUILayout.LayerField(new GUIContent("Inactive Ragdoll Layer", InspectorUtility.GetFieldTooltip(target, "m_InactiveRagdollLayer")), ragdollLayerFieldValue);
if (ragdollLayerFieldValue != value) {
InspectorUtility.SetFieldValue(target, "m_InactiveRagdollLayer", value);
}
InspectorUtility.DrawField(target, "m_CameraRotationalForce");
base.DrawInspectorDrawerFields(target, parent);
}
/// <summary>
/// Allows abilities to draw custom controls under the "Editor" foldout of the ability inspector.
/// </summary>
/// <param name="ability">The ability whose editor controls are being retrieved.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
/// <returns>Any custom editor controls. Can be null.</returns>
public override Action GetEditorCallback(Ability ability, UnityEngine.Object parent)
{
var baseCallback = base.GetEditorCallback(ability, parent);
baseCallback += () =>
{
EditorGUILayout.BeginHorizontal();
GUILayout.Space(InspectorUtility.IndentWidth * 2);
if (GUILayout.Button("Add Ragdoll Colliders")) {
AddRagdollColliders((parent as Component).gameObject);
}
if (GUILayout.Button("Remove Ragdoll Colliders")) {
RemoveRagdollColliders((parent as Component).gameObject);
}
EditorGUILayout.EndHorizontal();
};
return baseCallback;
}
/// <summary>
/// Uses Unity's Ragdoll Builder to create the ragdoll.
/// </summary>
/// <param name="character">The character to add the ragdoll to.</param>
public static void AddRagdollColliders(GameObject character)
{
var ragdollBuilderType = Type.GetType("UnityEditor.RagdollBuilder, UnityEditor");
var windows = Resources.FindObjectsOfTypeAll(ragdollBuilderType);
// Open the Ragdoll Builder if it isn't already opened.
if (windows == null || windows.Length == 0) {
EditorApplication.ExecuteMenuItem("GameObject/3D Object/Ragdoll...");
windows = Resources.FindObjectsOfTypeAll(ragdollBuilderType);
}
if (windows != null && windows.Length > 0) {
var ragdollWindow = windows[0] as ScriptableWizard;
var animator = character.GetComponent<Animator>();
if (animator == null) {
return;
}
SetFieldValue(ragdollWindow, "pelvis", animator.GetBoneTransform(HumanBodyBones.Hips));
SetFieldValue(ragdollWindow, "leftHips", animator.GetBoneTransform(HumanBodyBones.LeftUpperLeg));
SetFieldValue(ragdollWindow, "leftKnee", animator.GetBoneTransform(HumanBodyBones.LeftLowerLeg));
SetFieldValue(ragdollWindow, "leftFoot", animator.GetBoneTransform(HumanBodyBones.LeftFoot));
SetFieldValue(ragdollWindow, "rightHips", animator.GetBoneTransform(HumanBodyBones.RightUpperLeg));
SetFieldValue(ragdollWindow, "rightKnee", animator.GetBoneTransform(HumanBodyBones.RightLowerLeg));
SetFieldValue(ragdollWindow, "rightFoot", animator.GetBoneTransform(HumanBodyBones.RightFoot));
SetFieldValue(ragdollWindow, "leftArm", animator.GetBoneTransform(HumanBodyBones.LeftUpperArm));
SetFieldValue(ragdollWindow, "leftElbow", animator.GetBoneTransform(HumanBodyBones.LeftLowerArm));
SetFieldValue(ragdollWindow, "rightArm", animator.GetBoneTransform(HumanBodyBones.RightUpperArm));
SetFieldValue(ragdollWindow, "rightElbow", animator.GetBoneTransform(HumanBodyBones.RightLowerArm));
SetFieldValue(ragdollWindow, "middleSpine", animator.GetBoneTransform(HumanBodyBones.Spine));
SetFieldValue(ragdollWindow, "head", animator.GetBoneTransform(HumanBodyBones.Head));
var method = ragdollWindow.GetType().GetMethod("CheckConsistency", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null) {
ragdollWindow.errorString = (string)method.Invoke(ragdollWindow, null);
ragdollWindow.isValid = string.IsNullOrEmpty(ragdollWindow.errorString);
}
}
}
/// <summary>
/// Use reflection to set the value of the field.
/// </summary>
private static void SetFieldValue(ScriptableWizard obj, string name, object value)
{
if (value == null) {
return;
}
var field = obj.GetType().GetField(name);
if (field != null) {
field.SetValue(obj, value);
}
}
/// <summary>
/// Removes the ragdoll colliders from the specified character.
/// </summary>
/// <param name="character">The character to remove the ragdoll colliders from.</param>
private void RemoveRagdollColliders(GameObject character)
{
// If the character is a humanoid then the ragdoll colliders are known ahead of time. Generic characters are required to be searched recursively.
var animator = character.GetComponent<Animator>();
if (animator != null && animator.GetBoneTransform(HumanBodyBones.Head) != null) {
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.Hips), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.LeftUpperLeg), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.LeftLowerLeg), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.LeftFoot), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.RightUpperLeg), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.RightLowerLeg), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.RightFoot), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.LeftUpperArm), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.LeftLowerArm), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.RightUpperArm), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.RightLowerArm), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.Spine), false);
RemoveRagdollColliders(animator.GetBoneTransform(HumanBodyBones.Head), false);
} else {
RemoveRagdollColliders(character.transform, true);
}
}
/// <summary>
/// Removes the ragdoll colliders from the transform. If removeChildColliders is true then the method will be called recursively.
/// </summary>
/// <param name="transform">The transform to remove the colliders from.</param>
/// <param name="removeChildColliders">True if the colliders should be searched for recursively.</param>
private void RemoveRagdollColliders(Transform transform, bool removeChildColliders)
{
if (transform == null) {
return;
}
if (removeChildColliders) {
var children = transform.childCount;
for (int i = 0; i < transform.childCount; ++i) {
var child = transform.GetChild(i);
// No ragdoll colliders exist under the Character layer GameObjects no under the item GameObjects.
if (child.gameObject.layer == LayerManager.Character || child.GetComponent<ItemPlacement>() != null || child.GetComponent<ItemSlot>() != null) {
continue;
}
#if FIRST_PERSON_CONTROLLER
// First person objects do not contain any ragdoll colliders.
if (child.GetComponent<UltimateCharacterController.FirstPersonController.Character.FirstPersonObjects>() != null) {
continue;
}
#endif
// Remove the ragdoll from the transform and recursively check the children.
RemoveRagdollCollider(child);
RemoveRagdollColliders(child, true);
}
} else {
RemoveRagdollCollider(transform);
}
}
/// <summary>
/// Removes the ragdoll colliders from the specified transform.
/// </summary>
/// <param name="transform">The transform to remove the ragdoll colliders from.</param>
private void RemoveRagdollCollider(Transform transform)
{
var collider = transform.GetComponent<Collider>();
var rigidbody = transform.GetComponent<Rigidbody>();
// If the object doesn't have a collider and a rigidbody then it isn't a ragdoll collider.
if (collider == null || rigidbody == null) {
return;
}
UnityEngine.Object.DestroyImmediate(collider, true);
var characterJoint = transform.GetComponent<CharacterJoint>();
if (characterJoint != null) {
UnityEngine.Object.DestroyImmediate(characterJoint, true);
}
// The rigidbody must be removed last to prevent conflicts.
UnityEngine.Object.DestroyImmediate(rigidbody, true);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 62c29328a51c39541a1b10b8963e54b7
timeCreated: 1506296478
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,70 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character.Abilities
{
using Opsive.UltimateCharacterController.Character.Abilities;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using UnityEditor;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the RestrictPosition Ability.
/// </summary>
[InspectorDrawer(typeof(RestrictPosition))]
public class RestrictPositionInspectorDrawer : AbilityInspectorDrawer
{
/// <summary>
/// Draws the fields related to the inspector drawer.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
protected override void DrawInspectorDrawerFields(object target, Object parent)
{
var restriction = (RestrictPosition.RestrictionType)EditorGUILayout.EnumPopup(new GUIContent("Restriction", InspectorUtility.GetFieldTooltip(target, "m_Restriction")),
InspectorUtility.GetFieldValue<RestrictPosition.RestrictionType>(target, "m_Restriction"));
InspectorUtility.SetFieldValue(target, "m_Restriction", restriction);
// Draw the x restriction.
if (restriction != RestrictPosition.RestrictionType.RestrictZ) {
EditorGUI.indentLevel++;
var minValue = InspectorUtility.GetFieldValue<float>(target, "m_MinXPosition");
var maxValue = InspectorUtility.GetFieldValue<float>(target, "m_MaxXPosition");
minValue = EditorGUILayout.FloatField(new GUIContent("Min X Position", InspectorUtility.GetFieldTooltip(target, "m_MinXPosition")), minValue);
if (minValue > maxValue) {
maxValue = minValue;
}
maxValue = EditorGUILayout.FloatField(new GUIContent("Max X Position", InspectorUtility.GetFieldTooltip(target, "m_MaxXPosition")), maxValue);
if (maxValue < minValue) {
minValue = maxValue;
}
InspectorUtility.SetFieldValue(target, "m_MinXPosition", minValue);
InspectorUtility.SetFieldValue(target, "m_MaxXPosition", maxValue);
EditorGUI.indentLevel--;
}
// Draw the z restriction.
if (restriction != RestrictPosition.RestrictionType.RestrictX) {
EditorGUI.indentLevel++;
var minValue = InspectorUtility.GetFieldValue<float>(target, "m_MinZPosition");
var maxValue = InspectorUtility.GetFieldValue<float>(target, "m_MaxZPosition");
minValue = EditorGUILayout.FloatField(new GUIContent("Min Z Position", InspectorUtility.GetFieldTooltip(target, "m_MinZPosition")), minValue);
if (minValue > maxValue) {
maxValue = minValue;
}
maxValue = EditorGUILayout.FloatField(new GUIContent("Max Z Position", InspectorUtility.GetFieldTooltip(target, "m_MaxZPosition")), maxValue);
if (maxValue < minValue) {
minValue = maxValue;
}
InspectorUtility.SetFieldValue(target, "m_MinZPosition", minValue);
InspectorUtility.SetFieldValue(target, "m_MaxZPosition", maxValue);
EditorGUI.indentLevel--;
}
base.DrawInspectorDrawerFields(target, parent);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: bdb48f37043cc1043873cd20de952992
timeCreated: 1506296478
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,126 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character.Abilities
{
using Opsive.UltimateCharacterController.Character.Abilities;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using Opsive.UltimateCharacterController.Game;
using Opsive.UltimateCharacterController.Utility;
using System;
using UnityEditor;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the Lean Ability.
/// </summary>
[InspectorDrawer(typeof(Rideable))]
public class RideableInspectorDrawer : AbilityInspectorDrawer
{
/// <summary>
/// The ability has been added to the Ultimate Character Locomotion. Perform any initialization.
/// </summary>
/// <param name="ability">The ability that has been added.</param>
/// <param name="parent">The parent of the added ability.</param>
public override void AbilityAdded(Ability ability, UnityEngine.Object parent)
{
AddDismountColliders(ability as Rideable, (parent as Component).gameObject);
}
/// <summary>
/// The ability has been removed from the Ultimate Character Locomotion. Perform any destruction.
/// </summary>
/// <param name="ability">The ability that has been removed.</param>
/// <param name="parent">The parent of the removed ability.</param>
public override void AbilityRemoved(Ability ability, UnityEngine.Object parent)
{
RemoveDismountColliders(ability as Rideable, (parent as Component).gameObject);
}
/// <summary>
/// Allows abilities to draw custom controls under the "Editor" foldout of the ability inspector.
/// </summary>
/// <param name="ability">The ability whose editor controls are being retrieved.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
/// <returns>Any custom editor controls. Can be null.</returns>
public override Action GetEditorCallback(Ability ability, UnityEngine.Object parent)
{
var baseCallback = base.GetEditorCallback(ability, parent);
baseCallback += () =>
{
EditorGUILayout.BeginHorizontal();
GUILayout.Space(InspectorUtility.IndentWidth * 2);
var rideableAbility = ability as Rideable;
GUI.enabled = rideableAbility.LeftDismountCollider == null || rideableAbility.RightDismountCollider == null;
if (GUILayout.Button("Add Dismount Colliders")) {
AddDismountColliders(rideableAbility, (parent as Component).gameObject);
}
GUI.enabled = rideableAbility.LeftDismountCollider != null || rideableAbility.RightDismountCollider != null;
if (GUILayout.Button("Remove Dismount Colliders")) {
RemoveDismountColliders(rideableAbility, (parent as Component).gameObject);
}
GUI.enabled = true;
EditorGUILayout.EndHorizontal();
};
return baseCallback;
}
/// <summary>
/// Adds the colliders to the rideable ability.
/// </summary>
/// <param name="rideable">The ability to add the colliders to.</param>
/// <param name="parent">The parent of the rideable ability.</param>
private void AddDismountColliders(Rideable rideableAbility, GameObject parent)
{
// Position the collider under the Colliders GameObject if it exists.
Transform collidersTransform;
if ((collidersTransform = parent.transform.Find("Colliders"))) {
parent = collidersTransform.gameObject;
}
rideableAbility.LeftDismountCollider = CreateCollider(parent, "Left Dismount Collider", new Vector3(-0.9f, 1, 0));
rideableAbility.RightDismountCollider = CreateCollider(parent, "Right Dismount Collider", new Vector3(0.9f, 1, 0));
}
/// <summary>
/// Creates the dismount collider
/// </summary>
/// <param name="parent">The parent of the rideable ability.</param>
/// <param name="name">The name of the collider.</param>
/// <param name="position">The local poistion of the collider.</param>
/// <returns>The created collider.</returns>
private Collider CreateCollider(GameObject parent, string name, Vector3 position)
{
var collider = new GameObject(name);
collider.layer = LayerManager.SubCharacter;
collider.transform.SetParentOrigin(parent.transform);
collider.transform.localPosition = position;
var capsuleCollider = collider.AddComponent<CapsuleCollider>();
capsuleCollider.radius = 0.5f;
capsuleCollider.height = 1.5f;
return capsuleCollider;
}
/// <summary>
/// Removes the collider from the rideable ability.
/// </summary>
/// <param name="rideableAbility">The ability to remove the colliders from.</param>
/// <param name="parent">The parent of the rideable ability.</param>
private void RemoveDismountColliders(Rideable rideableAbility, GameObject parent)
{
if (rideableAbility.LeftDismountCollider != null) {
UnityEngine.Object.DestroyImmediate(rideableAbility.LeftDismountCollider.gameObject, true);
rideableAbility.LeftDismountCollider = null;
}
if (rideableAbility.RightDismountCollider != null) {
UnityEngine.Object.DestroyImmediate(rideableAbility.RightDismountCollider.gameObject, true);
rideableAbility.RightDismountCollider = null;
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 94962b59908bc7e40a31bbf9a36e6523
timeCreated: 1506296478
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -0,0 +1,82 @@
/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Character.Abilities.Starters
{
using Opsive.UltimateCharacterController.Character.Abilities.Starters;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using UnityEditor;
using UnityEngine;
/// <summary>
/// Draws a custom inspector for the ComboTimeout AbilityStarter.
/// </summary>
[InspectorDrawer(typeof(ComboTimeout))]
public class ComboTimeoutInspectorDrawer : InspectorDrawer
{
/// <summary>
/// Called when the object should be drawn to the inspector.
/// </summary>
/// <param name="target">The object that is being drawn.</param>
/// <param name="parent">The Unity Object that the object belongs to.</param>
public override void OnInspectorGUI(object target, Object parent)
{
var comboTimeout = target as ComboTimeout;
EditorGUI.BeginChangeCheck();
// Draw a custom array inspector for the input names.
var elements = comboTimeout.ComboInputElements;
if (elements == null || elements.Length == 0) {
elements = new ComboTimeout.ComboInputElement[1];
GUI.changed = true;
}
// Draw the table header.
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("");
var prevLabelWidth = EditorGUIUtility.labelWidth;
GUILayout.Space(-110);
EditorGUIUtility.labelWidth = 60;
EditorGUILayout.LabelField("Input Name");
GUILayout.Space(-30);
EditorGUILayout.LabelField("Start Type", GUILayout.MaxWidth(180));
GUILayout.Space(-100);
EditorGUILayout.LabelField("Timeout", GUILayout.Width(140));
EditorGUIUtility.labelWidth = prevLabelWidth;
EditorGUILayout.EndHorizontal();
// Draw each combo element.
for (int i = 0; i < elements.Length; ++i) {
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Combo " + (i + 1));
GUILayout.Space(-110);
elements[i].InputName = EditorGUILayout.TextField(elements[i].InputName);
GUILayout.Space(-30);
elements[i].AxisInput = EditorGUILayout.Popup(elements[i].AxisInput ? 1 : 0, new string[] { "Button Down", "Axis" }, GUILayout.MaxWidth(180)) == 1;
GUILayout.Space(-30);
// The first element does not use the timeout value.
GUI.enabled = i > 0;
elements[i].Timeout = EditorGUILayout.FloatField(elements[i].Timeout, GUILayout.Width(140 - (i == elements.Length - 1 ? 44 : 0)));
GUI.enabled = true;
// Only the last row can add/remove elements.
if (i == elements.Length - 1) {
if (i > 0 && GUILayout.Button(InspectorStyles.RemoveIcon, InspectorStyles.NoPaddingButtonStyle, GUILayout.Width(18))) {
System.Array.Resize(ref elements, elements.Length - 1);
}
if (GUILayout.Button(InspectorStyles.AddIcon, InspectorStyles.NoPaddingButtonStyle, GUILayout.Width(18))) {
System.Array.Resize(ref elements, elements.Length + 1);
elements[elements.Length - 1] = elements[elements.Length - 2];
}
}
EditorGUILayout.EndHorizontal();
}
if (EditorGUI.EndChangeCheck()) {
comboTimeout.ComboInputElements = elements;
GUI.changed = true;
}
}
}
}

View File

@@ -0,0 +1,13 @@
fileFormatVersion: 2
guid: 8820b7002b4ba1d489e7474e957b6509
timeCreated: 1544409577
licenseType: Pro
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Some files were not shown because too many files have changed in this diff Show More