読者です 読者をやめる 読者になる 読者になる

コガネブログ

平日更新を目標にUnityやC#などのゲーム開発アレコレを書いていきます

【Unity】指定されたオブジェクトの名前を返す、オブジェクトが null の場合は既定値を返す拡張メソッド

using UnityEngine;

/// <summary>
/// UnityEngine.Object 型の拡張メソッドを管理するクラス
/// </summary>
public static class UnityEngineObjectExt
{
    /// <summary>
    /// 名前を返します。null の場合は既定値を返します
    /// </summary>
    public static string GetNameOfDefault( 
        this UnityEngine.Object self, 
        string defaultValue = "" 
    )
    {
        return self != null ? self.name : defaultValue;
    }
}
var name1 = gameObject.GetNameOfDefault();
var name2 = gameObject.GetNameOfDefault( "ピカチュウ" );

【Unity】【NGUI】BoxColliderの位置とサイズをUIWidgetのパラメータに合わせて調整するボタンをInspectorに追加するエディタ拡張

using System.Linq;
using UnityEditor;
using UnityEngine;

[CanEditMultipleObjects]
[CustomEditor( typeof( BoxCollider ), true )]
public sealed class BoxColliderInspector : Editor
{
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        
        var boxCollider = target as BoxCollider;
        
        if ( boxCollider == null ) return;
        
        var uiWidget = boxCollider.GetComponent<UIWidget>();
        
        if ( uiWidget == null ) return;
        
        EditorGUI.BeginChangeCheck();
            
        serializedObject.Update();
        
        if ( GUILayout.Button( "Adjust To Match" ) )
        {
            NGUITools.UpdateWidgetCollider( boxCollider, true );
        }
            
        serializedObject.ApplyModifiedProperties();
        
        if ( !EditorGUI.EndChangeCheck() ) return;
        
        foreach ( var n in targets.OfType<BoxCollider>() )
        {
            NGUITools.UpdateWidgetCollider( n, true );
        }
    }
}

f:id:baba_s:20161103114816p:plain

【Unity】【NGUI】BoxColliderの位置とサイズをUIWidgetのパラメータに合わせて調整するコンテキストメニューを追加するエディタ拡張

using UnityEditor;
using UnityEngine;

public static class BoxColliderContextMenu
{
    [MenuItem( "CONTEXT/BoxCollider/Adjust To Match" )]
    private static void AdjustToMatch( MenuCommand command )
    {
        var boxCollider = command.context as BoxCollider;
        NGUITools.UpdateWidgetCollider( boxCollider, true );
    }
    
    [MenuItem( "CONTEXT/BoxCollider/Adjust To Match", true )]
    private static bool CanAdjustToMatch( MenuCommand command )
    {
        var boxCollider = command.context as BoxCollider;
        var uiWidget = boxCollider.GetComponent<UIWidget>();
        return uiWidget != null;
    }
}

f:id:baba_s:20161103112803p:plain

【Unity】ネットワークにアクセス可能かどうかを取得する方法

Application.internetReachability を使用する

switch ( Application.internetReachability )
{
    case NetworkReachability.NotReachable:
        Debug.Log( "ネットワークが使えない" );
        break;
        
    case NetworkReachability.ReachableViaCarrierDataNetwork:
        Debug.Log( "キャリアネットワークでアクセス可能" );
        break;
        
    case NetworkReachability.ReachableViaLocalAreaNetwork:
        Debug.Log( "WiFi でアクセス可能" );
        break;
}

参考サイト様

【Unity】指定されたオブジェクトがプレハブではない場合 true を返す拡張メソッド

using UnityEditor;

/// <summary>
/// UnityEngine.Object 型の拡張メソッドを管理するクラス
/// </summary>
public static partial class UnityEngineObjectExt
{
    /// <summary>
    /// 指定されたオブジェクトがプレハブではない場合 true を返します
    /// </summary>
    public static bool IsNotPrefab( this UnityEngine.Object self )
    {
        var type = PrefabUtility.GetPrefabType( self );
        
        return 
            type == PrefabType.None                         || 
            type == PrefabType.MissingPrefabInstance        || 
            type == PrefabType.DisconnectedPrefabInstance
        ;
    }
}
if ( gameObject.IsNotPrefab() )
{
    ...
}