Cooooding!!

Unity(C#)を使ったゲーム開発関連Tipsなど

Unityで使えるメモリ量を取得する方法まとめ

概要 UnityやC#にはメモリ量を取得する関数がいくつかありますが、関数の種類が多く特定の環境でしか使えない関数もあったりして複雑なのでまとめてみました。Windows、Mac、iOS、Androidで確認しています。 取得方法まとめ 取れる値関数 デバイスメモリ量Sy…

iOSでアプリのメモリ使用量を取得する【Unity】

概要 iOSでアプリがメモリ不足でキルされるまでにどれくらい余裕があるかを判定するためにメモリ使用量を取得する方法を調べました。取得できるメモリ量にはいろいろな種類があり、なかなか適切な取得方法がわからなかったので調べた結果わかったことをまと…

Native Pluginを作らずにAndroidアプリのメモリ使用量を取得する【Unity】

概要 Androidでアプリ全体のメモリ使用量を取得する場合Native Pluginを作るのが一般的ですが、AndroidJavaClassを使えばNative Plugin無しでも実装できそうだったので実装してみました。 実装 public static long GetMemorySize() { var unityPlayer = new …

Windowsアプリのメモリ使用量を取得する【Unity】

概要 UnityではないC#であればSystem.Environment.WorkingSetやProcess.GetCurrentProcess().WorkingSet64などを使ってアプリのメモリ使用量を取得できますが、Unityで作ったWindows Standaloneアプリでは何故か0を返します。調べても解決方法が見つかりませ…

Unity2019.2に更新して発生したトラブルとその対処【Unity】

概要 プロジェクトをUnity2019.1.9f1からUnity2019.2.9f1に更新に更新したところ大量のコンパイルエラーが出てしまいました。調べてみたところどうやらAssembly Definitionの仕様変更による影響のようだったのでその詳細と対処方法をまとめます。 エラー内容…

TestRunnerでLogErrorや例外が発生することをテストする【Unity】

概要 TestRunnerで例外が発生することをテストするのはNUnit.Framework.Assert.Catchでできますが LogErrorのテストはできません。指定した文字列のLogErrorが出力されることをテストするのはTestTools.LogAssertでできますが、前回の記事で書いたように少し…

TestTools.LogAssertについて調べてみた【Unity】

概要 Test Runner(NUnit)でログが出力されることをテストできるTestTools.LogAssertを使おうと思ったのですが、ドキュメントを呼んでもよくわからなかったので詳しく調べてみました。 LogAssertの基礎 LogAssertにはExpectとNoUnexpectedReceivedの2つの関数…

FieldInfoが自動実装されたフィールドのものか判定する【C#】

概要 プロパティの実装を省略する自動実装プロパティ(Auto-Implemented Properties)を使うと自動的に見えないフィールドが追加されます。このフィールドはBackingFieldと呼ばれます。BackingFieldは普通にアクセスすることはできませんが、Reflectionを使…

TypeがStructかどうかを判定する【C#】

C#

概要 System.Typeがstructかどうかを判定しようと思ったら、System.Type.IsClassはあるのに何故かIsStructがなかったので判定方法を調べてみました。 判定方法 判定はIsValueTypeやIsPrimitiveなどを組み合わせて実装します。 public static bool IsStruct(S…

Interfaceに抽象ではないメソッドを追加する【C#】

C#

概要 C# Job Systemの勉強をしていたらインターフェースに抽象ではないメソッドを追加する面白いテクニックを見かけたので紹介します。 追加する方法 追加する方法は簡単で拡張メソッドを使うだけです。例えば以下のように実装します。 public interface IEn…

クリックした先のXY平面上の座標を取得する【Unity】

概要 クリックした先のXY平面上にエフェクトや敵を生成するテスト用のシーンを作るために、その座標を計算する関数を実装しました。Colliderを置いてPhysics.Raycastで座標を取得する方法もあるのですが、わざわざColliderを置くのも手間なのでColliderを使…

Unity2019に移行して発生したトラブルとその対処【Unity】

概要 これまでUnity2018.4で作っていたプロジェクトをそろそろ2019.1に乗り換えようと思い移行してみたところいくつかトラブルが発生しました。そのトラブル内容と対処内容をメモしておきます。 トラブル 1. prefabがおかしくなった prefabに付けた自作のコ…

Planeのdistanceについて【Unity】

概要 UnityEngine.Planeのdistanceがわかりにくく理解に少し苦労したのでわかったことをまとめました。 法線と距離を使った平面の表現 平面は法線と原点との距離を使って表すことができます。 UnityのPlaneも法線と距離を指定して初期化することができます。…

Gizmosで平面を描画する【Unity】

概要 計算結果の平面(UnityEngine.Plane)が正しいかどうかを確認するためにGizmosで描画しようと思ったら簡単に描画できる関数がなかったので実装してみました。Planeは長さを持たず無限に広がるため、描画時に座標とサイズを指定して一部分を描画すること…

VisualStudioでクラス名や変数名の命名規則をチェックする【C#】

概要 クラス名や変数名などの命名規則を決めていてもうっかり間違えることがよくあるので、Visual Studioの命名規則をチェックする機能を使ってみました。命名規則にあっていない部分に線が引かれるようになります。設定例(今筆者が使っている設定) 表示例…

4つの頂点座標からRectを求める【C#】

概要 与えられた複数の頂点(Vector2)が矩形(Rect)になるかどうかを判定して処理を分岐させたかったので、与えられた頂点からRectを求める関数を実装してみました。 実装 Rectを求める関数の実装: using System.Collections.Generic; using UnityEngine; publ…

Tilemapの情報をスクリプトから取得する【Unity】

概要 Tilemapの情報をスクリプトで取得して処理したかったので取得方法を調べてみました。 取得方法 タイルがどこに存在するかを取得する タイルが存在する範囲はTilemap.cellBoundsで知ることができます。この範囲のセルに対してTilemap.HasTileを使うこと…

2Dの地形に3DのColliderを付けてみる【Unity】

概要 少し前の記事で地形は2Dで3Dモデルに2DのColliderを付ける検証をしました。今回は逆に地形の方に3DのColliderを付ける検証をしてみました。3DモデルはRigidbodyのZ方向の移動とXY方向の回転を禁止(Freeze)してRigidbody2Dのような動きしかしないように…

FreezeをOnにしたRigidbodyを積み上げると勝手に動くことがある問題を解決する【Unity】

概要 Rigidbodyの動きを制限して2Dゲームのような動きをさせようと検証していたらRigidbodyが不自然な動きをすることがあったので調査してみました。 問題の再現方法 新規3Dプロジェクトを作る Terrainを作る カメラとの位置関係を調整するために座標を(-250…

3Dモデルに2DのColliderを付けてみる【Unity】

概要 地形は2Dでキャラクターは3Dモデルを使う2Dゲームを考えているのですが、2DのColliderと3DのColliderは衝突しないので3Dモデルに2DのColliderを付ける検証をしてみました。 検証 1.シンプルな形状 まずはCubeやCylinderなどのシンプルな形状のモデルにC…

ProCamera2Dのカメラが別のシーンに移動してしまう問題を解決する【Unity】

概要 ProCamera2Dのカメラを配置したシーンをAdditiveでロードすると何故かカメラが遷移前のシーンに移動してしまうことがありました。これはProCamera2Dの振動機能(ProCamera2DShake)などを使ったときにカメラの親GameObject (ProCamera2DShakeContainer)…

ActiveではないシーンにGameObjectを生成する【Unity】

概要 マルチシーン機能を使ってシーンをAdditiveでロードしたときに、遷移先のシーンではなく遷移前のシーンにGameObjectが生成されてしまうことがありました。これは遷移中はまだ遷移前のシーンがActiveであることが原因のようでした。そこでActiveではない…

シングルトンを継承する【C#】

C#

概要 汎用的なクラスをシングルトンとして実装して使おうと考えましたが、状況によっては機能を追加したくなりそうだったためシングルトンの継承をすることを考えてみました。 シングルトンの継承を活用するパターン シングルトンの継承を活用するパターンは…

CameraFilterPack用のデモシーンを作る【Unity】

概要 少し前にCamera Filter Packという300種類以上のカメラエフェクトを集めたAssetを買いました。使い方はシンプルでカメラにスクリプトをAdd Componentしてパラメーターを設定するだけです。簡単なのですがこのAssetにはデモシーンが含まれておらず一つ一…

スクリプトを書かずに無限に広がるマップが作れる『MapMagic』の基本的な使い方【Unity】

概要 少し前にMapMagic World GeneratorというAssetを買いました。 簡単に言えば、スクリプトを書かずにプロシージャルに地形(Terrain)を作ったりその地形の上に木や岩などのオブジェクトを配置できるツールです。あらかじめ決められたルールに従ってランダ…

インデクサーのPropertyInfoを取得する【C#】

概要 Reflectionを使ってプロパティやフィールドにアクセスする実装をするときにインデクサー(添え字演算子)のPropertyInfo(MemberInfo)を取得する方法がわからなかったので調べてみました。 取得方法 大抵のケースでは以下のように"Item"という名前のプロ…

リストの中から文字列で絞り込んで要素を選択するEditor用GUIを作る【Unity】

概要 リストの中から要素を選択させるGUIを作る場合、EditorGUILayout.Popupを使う方法がありますが要素が大量になってくると/で区切って分類しても探すのに苦労することがあります。そこで他にいい機能がないか探してみたところOdinの中にOdinSelectorとい…