Skip to content

Commit

Permalink
feat: スキンパーツIDが不正なときのエラー処理を追加
Browse files Browse the repository at this point in the history
  • Loading branch information
pspkurara committed Sep 8, 2020
1 parent ac8efda commit 3e07484
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 11 deletions.
7 changes: 7 additions & 0 deletions Packages/uGUI-Skinner/Editor/EditorConst.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@ public static class EditorConst

public const string FieldNumberTitle = "No.{0}";

public const string MissingSkinPartsTypeMessage = "Skin Parts Type \" {0} \" is incorrect.\nPlease delete this Skin or correct the value.";
public const MessageType MissingSkinPartsTypeMessageType = MessageType.Warning;

public const string MissingSkinPartsInspectorTypeMessage = "Inspector for \" {0} \" not found.\nPlease check if it is registered correctly";
public const MessageType MissingSkinPartsInspectorTypeMessageType = MessageType.Warning;


public static readonly GUILayoutOption SkinSelectArrowMaxWidth = GUILayout.MaxWidth(50);
public static readonly GUILayoutOption SkinAddOrRemoveButtonMaxWidth = GUILayout.MaxWidth(150);

Expand Down
12 changes: 12 additions & 0 deletions Packages/uGUI-Skinner/Editor/SkinPartsInspectorAccess.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,18 @@ public static ISkinPartsInspector GetSkinInspector(Type rootType)
return m_SkinPartsInspectors[rootType];
}

/// <summary>
/// スキンパーツインスペクターが正しく登録されているか取得する
/// </summary>
/// <param name="id">スキンパーツタイプ</param>
/// <returns>
/// タイプに一致するスキンパーツが存在する場合は真
/// </returns>
public static bool IsRegistedInspector(Type rootType)
{
return m_SkinPartsInspectors.ContainsKey(rootType);
}

#endregion

}
Expand Down
57 changes: 47 additions & 10 deletions Packages/uGUI-Skinner/Editor/UISkinnerInspector.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Pspkurara.UI.Skinner;
using System.Linq;
using System.Text;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
Expand Down Expand Up @@ -129,23 +130,46 @@ public override void OnInspectorGUI()
SerializedProperty skinPartsElementProperty = skinPartsProperty.GetArrayElementAtIndex(skinPartsIndex);
SerializedProperty skinPartsTypeProperty = skinPartsElementProperty.FindPropertyRelative(FieldName.Type);
int skinPartsType = skinPartsTypeProperty.intValue;
skinPartsTypeProperty.intValue = EditorGUILayout.IntPopup(skinPartsType, m_SkinnerPartsDisplayNames, m_SkinnerPartsOptionValues);

m_SkinPartsProperty.MapProperties(skinPartsElementProperty.FindPropertyRelative(FieldName.Property));

var rootType = SkinPartsAccess.GetSkinPartsRootType(skinPartsType);
var inspector = SkinPartsInspectorAccess.GetSkinInspector(rootType);
skinPartsTypeProperty.intValue = EditorGUILayout.IntPopup(skinPartsType, m_SkinnerPartsDisplayNames, m_SkinnerPartsOptionValues);

EditorGUI.indentLevel++;

EditorGUI.BeginChangeCheck();
inspector.DrawInspector(m_SkinPartsProperty);
if (EditorGUI.EndChangeCheck())
// タイプの登録を確認
if (SkinPartsAccess.IsCorrectSkinPartsId(skinPartsType))
{
if (skinStylesIndex == m_StyleIndex.intValue)
var rootType = SkinPartsAccess.GetSkinPartsRootType(skinPartsType);

// インスペクターの登録を確認
if (SkinPartsInspectorAccess.IsRegistedInspector(rootType))
{
var inspector = SkinPartsInspectorAccess.GetSkinInspector(rootType);

m_SkinPartsProperty.MapProperties(skinPartsElementProperty.FindPropertyRelative(FieldName.Property));

EditorGUI.BeginChangeCheck();
inspector.DrawInspector(m_SkinPartsProperty);
if (EditorGUI.EndChangeCheck())
{
if (skinStylesIndex == m_StyleIndex.intValue)
{
ApplySkin();
}
}

}
else
{
ApplySkin();
// 該当インスペクターが存在しない場合は何もしない
var skinPartsTypeName = SkinnerEditorUtility.GetEditorName(rootType.Name);
EditorGUILayout.HelpBox(string.Format(EditorConst.MissingSkinPartsInspectorTypeMessage, skinPartsTypeName), EditorConst.MissingSkinPartsInspectorTypeMessageType);
}

}
else
{
// 該当IDが存在しない場合は警告を出す
EditorGUILayout.HelpBox(string.Format(EditorConst.MissingSkinPartsTypeMessage, skinPartsType), EditorConst.MissingSkinPartsTypeMessageType);
}

EditorGUI.indentLevel--;
Expand Down Expand Up @@ -247,8 +271,21 @@ private void Cleanup()
SerializedProperty partsProp = skinPartsProperty.GetArrayElementAtIndex(skinPartsIndex);
SerializedProperty skinPartsTypeProperty = partsProp.FindPropertyRelative(FieldName.Type);
int skinPartsType = skinPartsTypeProperty.intValue;

// 該当IDが存在しない場合は何もしない
if (!SkinPartsAccess.IsCorrectSkinPartsId(skinPartsType))
{
continue;
}

var rootType = SkinPartsAccess.GetSkinPartsRootType(skinPartsType);

// 該当インスペクターが存在しない場合は何もしない
if (!SkinPartsInspectorAccess.IsRegistedInspector(rootType))
{
continue;
}

var inspector = SkinPartsInspectorAccess.GetSkinInspector(rootType);

m_SkinPartsProperty.MapProperties(partsProp.FindPropertyRelative(FieldName.Property));
Expand Down
13 changes: 13 additions & 0 deletions Packages/uGUI-Skinner/Runtime/DoNothingLogic.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Pspkurara.UI.Skinner
{

/// <summary>
/// 例外がきた時に返すダミーのロジック
/// </summary>
internal sealed class DoNothingLogic : ISkinLogic
{
public void SetValues(SkinPartsPropertry property) { }

}

}
11 changes: 11 additions & 0 deletions Packages/uGUI-Skinner/Runtime/DoNothingLogic.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 22 additions & 1 deletion Packages/uGUI-Skinner/Runtime/SkinPartsAccess.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,14 @@ internal static class SkinPartsAccess

/// <summary>
/// スキンパーツのIDとクラスを紐付ける一覧
/// スキンパーツが増えたら随時追加すること
/// </summary>
private static readonly Dictionary<int, SkinPartsAttribute> m_SkinParts = CreateSkinPartsList();

/// <summary>
/// スキンパーツIDがおかしいときに返すダミー処理
/// </summary>
private static readonly DoNothingLogic m_DoNothingLogic = new DoNothingLogic();

#endregion

#region メソッド
Expand All @@ -42,6 +46,11 @@ private static Dictionary<int, SkinPartsAttribute> CreateSkinPartsList()
/// <returns>スキンロジック</returns>
public static ISkinLogic CreateSkinLogicInstance(int id)
{
// 正しくないものがきたら空処理を返しておく
if (!IsCorrectSkinPartsId(id))
{
return m_DoNothingLogic;
}
return (ISkinLogic)Activator.CreateInstance(m_SkinParts[id].LogicType);
}

Expand All @@ -64,6 +73,18 @@ public static Type GetSkinPartsRootType(int id)
return m_SkinParts[id].RootType;
}

/// <summary>
/// スキンパーツIDが正しいか取得する
/// </summary>
/// <param name="id">スキンパーツID</param>
/// <returns>
/// IDに一致するスキンパーツが存在する場合は真
/// </returns>
public static bool IsCorrectSkinPartsId(int id)
{
return m_SkinParts.ContainsKey(id);
}

#endregion

}
Expand Down

0 comments on commit 3e07484

Please sign in to comment.