Cooooding!!

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

Unity

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つの関数…

クリックした先の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は長さを持たず無限に広がるため、描画時に座標とサイズを指定して一部分を描画すること…

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ではない…

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

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

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

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

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

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