コガネブログ

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

【Unity】Camera.ScreenToWorldPoint で毎回 z に 0 を入れなくて済む拡張メソッド

ソースコード using UnityEngine; namespace Kogane { public static class CameraExtensionMethods { public static Vector2 ScreenToWorldPoint2D ( this Camera self, Vector3 position ) { return self.ScreenToWorldPoint( position ); } public static…

【Unity】DOTween の Rotate 系の拡張メソッドで X・Y・Z を個別指定できるようにする拡張メソッド

ソースコード using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options; using UnityEngine; namespace Kogane { public static class DOTweenRotateExtensionMethods { public static TweenerCore<Quaternion, Vector3, QuaternionOptions> DORotateX ( this Transform self,</quaternion,>…

【Unity】Debug.Log をメソッドチェーンで書けるようにする拡張メソッド

ソースコード using UnityEngine; namespace Kogane { public static class DebugLogMethodChainingExtensionMethods { public delegate void LogDelegate( object item ); public static LogDelegate OnLog { get; set; } = item => Debug.Log( item ); pub…

【Unity】Java の Stream API の Peek のような機能を LINQ で使えるようにする拡張メソッド

ソースコード using System; using System.Collections.Generic; using JetBrains.Annotations; namespace Kogane { public static class IEnumerablePeekExtensionMethods { public static IEnumerable<T> Peek<T> ( [NotNull] this IEnumerable<T> source, [NotNull</t></t></t>…

【Unity】LINQ で抽出した要素をログ出力して確認できるようにする拡張メソッド

ソースコード using System; using System.Collections.Generic; using JetBrains.Annotations; using UnityEngine; namespace Kogane { public static class IEnumerableLogExtensionMethods { public delegate void LogDelegate( object item ); public st…

【Unity】DOTween でシーケンスへの Append・Insert・Join・Prepend を Tween のメソッドチェーンで書けるようにする拡張メソッド

ソースコード using DG.Tweening; namespace Kogane { public static class TweenExtensionMethods { public static Tween Append( this Tween self, Sequence sequence ) { sequence.Append( self ); return self; } public static Tween Insert( this Twee…

【Unity】DOTween の Transform 系の拡張メソッドを GameObject 型でも使えるようにする拡張メソッド

ソースコード using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options; using UnityEngine; namespace Kogane { public static class DOTweenTransformShortcutExtensionMethods { public static TweenerCore<Vector3, Vector3, VectorOptions> DOMove ( this GameObj</vector3,>…

【Unity】Instantiate を簡潔に記述できるようにする拡張メソッド

ソースコード using UnityEngine; public static class UnityEngineObjectExtensions { public static T Clone<T>( this T self ) where T : Component { return Object.Instantiate( self ); } public static T CloneInParent<T>( this T self ) where T : Compon</t></t>…

【Unity】Tilemap の SetTile で int や Vector2Int を渡せるようにする拡張メソッド

ソースコード using UnityEngine; using UnityEngine.Tilemaps; public static class TilemapExtensions { public static void SetTile ( this Tilemap self, int x, int y, TileBase tile ) { self.SetTile( new Vector3Int( x, y, 0 ), tile ); } public s…

【Unity】Tilemap のすべての Position を取得する拡張メソッド

ソースコード using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; public static class TilemapExtensions { public static IEnumerable<Vector3Int> GetPositions( this Tilemap self ) { var bound = self.cellBounds; for ( var x = </vector3int>…

【Unity】UniTask で処理の開始時と終了時にログを出力できるようにする拡張メソッド

ソースコード 使用例 using UniRx.Async; using UnityEngine; public sealed class Example : MonoBehaviour { private async void Start() { #if ENABLE_RELEASE #else UniTaskExt.OnStartLog += message => Debug.Log( $"{message} 開始" ); UniTaskExt.On…

【Unity】ゲームオブジェクトが破棄される時に自動で IDisposable.Dispose を呼び出す拡張メソッド

ソースコード 使用例 using System; using UnityEngine; public class Character : IDisposable { public void Dispose() { Debug.Log( "ピカチュウ" ); } } public class Example : MonoBehaviour { private void Start() { var character = new Character(…

【Unity】BuildTarget を BuildTargetGroup に変換する方法

概要 BuildPipeline.GetBuildTargetGroup を使用する もしくは下記のような拡張メソッドを自作する using UnityEditor; public static class BuildTargetExt { public static BuildTargetGroup ToBuildTargetGroup( this BuildTarget self ) { switch ( self…

【Unity】メソッドチェーンでリッチテキストを設定できる「RichText for Unity」紹介

はじめに 「RichText for Unity」を Unity プロジェクトに導入することで メソッドチェーンでリッチテキストを設定できるようになります 使用例 var str = "ピカチュウ"; // 通常 Debug.Log( $"<color=purple><size=17><b><i>{str}</i></b></size></color>"); // RichText for Unity Debug.Log( $"{str.Italic().B…

【Unity】Collision で CompareTag を使用できるようにする拡張メソッド

ソースコード using UnityEngine; namespace MyProject { public static class CollisionExt { public static bool CompareTag( this Collision self, string tag ) { return self.gameObject.CompareTag( tag ); } } } 使用例 適用前 private void OnCollis…

【Unity】Collision2D で CompareTag を使用できるようにする拡張メソッド

ソースコード using UnityEngine; namespace MyProject { public static class Collision2DExt { public static bool CompareTag( this Collision2D self, string tag ) { return self.gameObject.CompareTag( tag ); } } } 使用例 適用前 private void OnCo…

【Unity】GetComponentInParent の null チェックを少しだけ簡潔に記述できる TryGetComponentInParent 拡張メソッド

ソースコード using UnityEngine; public static class ComponentExt { public static bool TryGetComponentInParent<T>( this Component self, out T component ) where T : Component { component = self.GetComponentInParent<T>(); return component != null; </t></t>…

【Unity】GetComponentInChildren の null チェックを少しだけ簡潔に記述できる TryGetComponentInChildren 拡張メソッド

ソースコード using UnityEngine; public static class ComponentExt { public static bool TryGetComponentInChildren<T>( this Component self, out T component ) where T : Component { component = self.GetComponentInChildren<T>(); return component != nu</t></t>…

【Unity】TryGetComponent を Unity 2018 でも使用できるようにする拡張メソッド

ソースコード using UnityEngine; public static class ComponentExt { public static bool TryGetComponent<T>( this Component self, out T component ) where T : Component { component = self.GetComponent<T>(); return component != null; } } public stati</t></t>…

【Unity】Gradient で Lerp を使用できる「Unity Gradient Lerp」紹介

ソースコード 使用例 using UnityEngine; public class Example : MonoBehaviour { public Gradient m_gradient1; public Gradient m_gradient2; [Range( 0, 1 )] public float m_time; public Gradient m_gradient3; private void OnValidate() { m_gradien…

【Unity】プレハブもしくはプレハブのインスタンスの場合 false を返す拡張メソッド

ソースコード using UnityEditor; public static class UnityObjectExt { public static bool IsNotPrefab( this UnityEngine.Object self ) { var type = PrefabUtility.GetPrefabAssetType( self ); return type == PrefabAssetType.NotAPrefab; } } 使用…

【Unity】プレハブもしくはプレハブのインスタンスの場合 true を返す拡張メソッド

ソースコード using UnityEditor; public static class UnityObjectExt { public static bool IsPrefab( this UnityEngine.Object self ) { var type = PrefabUtility.GetPrefabAssetType( self ); return type != PrefabAssetType.NotAPrefab; } } 使用例 D…

【Unity】static な event の登録数を取得する方法

概要 using System; using System.Reflection; public static class DelegateExt { public static int GetLength<T>( string name ) { return GetLength( typeof( T ), name ); } public static int GetLength( this Type self, string name ) { var attrs = Bi</t>…

【Unity】ゲームオブジェクトの Hierarchy におけるパスを取得できる拡張メソッド

ソースコード using UnityEngine; public static class GameObjectExt { public static string GetHierarchyPath( this GameObject gameObject ) { var path = gameObject.name; var parent = gameObject.transform.parent; while ( parent != null ) { path…

【Unity】Animator Controller のいずれかのステートの Motion が null になっている場合に true を返す拡張メソッド

概要 using System.Linq; using UnityEditor.Animations; public static class AnimatorControllerExt { public static bool HasNullMotion( this AnimatorController self ) { foreach ( var n in self.layers ) { if ( n.stateMachine.states.Any( c => c.…

【Unity】uGUI の Toggle の isOn をスクリプトから設定する時に onValueChanged を発生しない拡張メソッド

ソースコード using UnityEngine.UI; public static class ToggleExt { public static void SetIsOnWithoutCallback( this Toggle self, bool isOn ) { var onValueChanged = self.onValueChanged; self.onValueChanged = new Toggle.ToggleEvent(); self.is…

【Unity】便利な関数や拡張メソッドを使用できる「unity-utils」紹介

はじめに 「unity-utils」を Unity プロジェクトに導入することで 便利な関数や拡張メソッドを使用できるようになります 使用例 RandomUtil using Assets.Scripts.Utils; using System.Collections.Generic; using UnityEngine; public class Example : Mono…

【Unity】ベクトルと角度を変換できる拡張メソッド

ソースコード 使用例 var dir = Vector2.right; var rot = dir.VectorToDeg(); var angle = 123f; var vec = angle.DegToVector(); 参考ツイート whip those unity types into shape and add your own functionality via extension methods. for instance: c…

【Unity】RectTransform の anchoredPosition を設定する拡張メソッド

ソースコード using UnityEngine; public static class RectTransformExt { public static void SetAnchoredPositionX ( this RectTransform self, float x ) { var pos = self.anchoredPosition; pos.x = x; self.anchoredPosition = pos; } public static …

【Unity】UnityEvent で RemoveAllListeners してから AddListener する拡張メソッド

ソースコード using System; using UnityEngine.Events; public static class UnityEventExt { public static void SetListener( this UnityEvent self, Action call ) { self.RemoveAllListeners(); self.AddListener( () => call() ); } public static voi…