up:: Programming
猫本
MUN
Exploring HTN Planners through Example
公式リファレンスは目を通そう
その機能、公式にあります。ということが多発する。
Unityに限らず、何でもそうだけど。
複数人開発
頼む仕事に関する関数とその仕様はしっかり伝える。
using UnityEngine.SceneManagement
シーン遷移を扱うなら必要な名前空間。
GetComponent<>()
オブジェクトのコンポーネントを取得するメソッド。
collisionやGameObjectのメソッドとして呼べる。
たまに単体で書かれているのは、頭のthis.が省略されているから。
<>には欲しいコンポーネントの名前を指定する。<Renderer>など。Obsidianだと書けないからエスケープ入れてる。
初心者向け UnityのGetComponentってなんやねん? - Qiita
【Unity連載】GetComponentを具体例付きで解説
ちなみに、これで取得する自分自身のクラスのコンポーネントとthisは同一。
まあクラスだし。
GetComponentInChildren<>()
オブジェクト以下のコンポーネントを取得するメソッド。
そのままだと一個しか返してくれないので、配列で返してほしいときはCompornentsとする。
スクリプトからコンポーネントを取得する方法 | Uinty使い方ガイド
フラグ管理とビット演算
引き算を足し算にするやつ
上記の内容をフラグ管理に発展させたもの。
1ビットずつのONOFFをフラグのONOFFとすることで、4桁の01の組み合わせ、すなわち4ビットでも2^4=16種類を表せる。
ただ、可読性は下がる。
早いには早いが、bool構造体を使ったほうが分かりやすい。
複数のフラグを1つの変数のみで管理する - N煎ログブログ
ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜 - Qiita
transform.position
各成分は直接書き換えることができない。
必ず、new Vector3(0,0,0)などVector3の塊で書き換える。
2D描画順
- Sorting Layer
- Order in Layer(小さい奴が画面奥、優先度)
- カメラに近い順
の順で判定している。より詳しく設定したいときはTransparency Sort Modeをいじればいい。
【Unity】スプライトの描画順を「下にある物を手前」にする - テラシュールブログ
transform.childCount
そのオブジェクト以下に入ってる子オブジェクトの数が入ってる。
子のオブジェクトを番号で取得できるtransform.GetChild()とfor文と組み合わせれば、子のオブジェクトをすべて取得できる。
gameObject.SetActive()
boolを入れることでオブジェクトのアクティベートができるメソッド。
当然、これでアクティブにしても親がアクティブでないなら見えない。
【Unity基礎】SetActiveを使ってゲームオブジェクトを表示・非表示にする方法 | FREE SWORDER
GameObject.activeInHierarchy
オブジェクトがアクティブかどうかをboolで返してくれる変数。
親が非アクティブ、自分がアクティブだとFalseになる。
【Unity】GameObjectのactive状態を取得するときの注意点
PrefabとInstance
Object-Instantiate - Unity スクリプトリファレンス
Tagは引き継がず、nameは後ろに(Clone)がつく。
その辺はインスタンスといってもゲームオブジェクトなので、.tagや.nameをいじれば変えられる。
異なるタグでプレハブをインスタンス化する-UnityAnswers
インスタンス化されたプレハブに複数の(クローン)が表示されるのはなぜですか? -Unityフォーラム
ランタイムのプレハブのインスタンス化 - Unity マニュアル
複数一気のプレハブ化
UnityEditor上で複数のゲームオブジェクトをプレハブ化する方法 | ⬢ Appirits spirits
【Unity】【エディタ拡張】複数のオブジェクトをまとめてPrefab化する - Qiita
ただし、何故かどちらも動作しないので、やりたいなら自分でいじること。
インスタンスに加えた変更をPrefabに適用
右上のOverrideを使うか、Prefabの3ドットメニューからModeified Componetを使うか。
Unityの短いヒント:シーンで行われた変更をプレハブに適用します-DotNetByExample-次世代
Prefab Variant
オブジェクトの一部をPrefab設計図にする機能。
ステージによって基礎は同じにしたいが、中身は変えたいなってときに。
意外にもこれが導入されたのは2018.3から。
Unity 新しいPrefab システム - kurihara-nの日記
ちなみに、Transformは消せないのでVariantにできない。
Rect Transformも入れ替わるだけ。
スクリプト実行順序
地味にめちゃくちゃ大事な奴。
【Unity】狙った順に処理したい時はスクリプトの実行順を指定する │ エクスプラボ
子オブジェクト全取得
Unityで子オブジェクトを全取得する方法 | よしゆきゲーム制作スタジオ
【Unity】子オブジェクトを取得する4つの方法
【Unity】子要素のオブジェクトを取得する方法まとめ | あっぷあっぷ開発基地
非アクティブオブジェクト取得
C# - Unityで非アクティブのオブジェクトを取得する方法|teratail
乱数
何か理由があってusing System;としていると、C#標準のRandomと区別がつかずにコンパイルエラーになる。
その時は頭にどちらのRandomか明記すること。
【Unity連載】ランダムな要素の作成には乱数を使おう | TECH Projin
Render Texture
ゲーム内でカメラに映る光景を、動く写真としてゲーム内に再出力するような機能。
レーダーなんかに使うものだが、スクショにも使える。
レンダーテクスチャを使ってカメラに映る映像をリアルタイムに描写する | Unityを使った3Dゲームの作り方(かめくめ)
UnityでRenderTextureをファイルに保存 | STYLY 開発者ブログ -STYLY Developer’s Blog-
ちなみにスクショだけならTexture2Dに映してbyte化し、File.WriteAllByte(filename, byte);で書き込むだけでいい。
[Unity] 画面をキャプチャーしてPNGファイルへ出力する [Not RenderTexture] | きききろく
【Unity】スクリーンショットを保存する | ねこじゃらシティ
スプライトごみ問題
原因
複数のスプライトを一枚の絵にして描画を高速化する機能、スプライトアトラスにて、隣の絵のピクセルを巻き込んで表示してしまうことで起きる。
解決
余白を開ければいい。
それができないなら、いろんな方法を纏めて試さないといけない。
【Unity】スプライト端の謎の線/ゴミ/ちらつきの修正方法 - エフアンダーバー
ならpaddingを追加するだけで直りそうなもんだが、PSDImporterにその機能はない。 少なくとも2021年5月時点では。
PSDインポーター? | ページ3-Unityフォーラム
Spriteをパックする新しい仕組み、SpriteAtlasを使ってみた【Unity】【SpriteAtlas】 - (:3[kanのメモ帳]
音
AudioSourceから鳴らしていく。
.Play、.Pause、.UnPauseを覚えればしばらく安泰。
【Unity初心者】サウンドの基本を理解して再生や停止をしてみよう
現在の再生時間は.timeから見える。
サウンドを途中から再生する - Unity / VRゲーム開発日記@長崎
設計問題
フレームワークと結婚するな
設計が前に出てきて、その上にフレームワークが乗っかる感じ
端的に言うなら、常にMonoBehaviorを継承する必要はない。
万能なアーキテクチャは存在しない Unityのプロジェクトにあわせたアーキテクチャの“育て方” - ログミーTech
Fileの読み書き
C#機能。
非同期処理
【Unity】一定時間後にスクリプトの処理を呼び出す方法まとめ - Qiita
デリゲートはいい。
が、Taskの機能を損なわない程度に。
Coroutine
非同期的処理を行えるシステム。
この処理を待っている間に他のことをやっておきたい、というときに使える。
普通に時間を待つときにも使える。
戻り値が返せない。 欲しいならasyncで。
デリゲートを駆使すれば返せなくもないらしいが、async使え。
【Unity】コルーチンってなんなのなの? って時に読む記事【解説】 │ エクスプラボ
【Unity】IEnumeratorを使って非同期処理を行う | あのゲームの作り方@わたぶろぐ
【Unity】コルーチンで処理を中断・再開・停止させる方法を学ぶ – XR-Hub
ただ高速化したい、仕事のないコアに仕事割り振って並列的に処理したい、というときはC# Job Systemを使うといい。
止めたいときはStopAllCouroutineというものもある。
全て止める。
Unity-スクリプトAPI:MonoBehaviour.StopAllCoroutines
コンポーネントとしてくっついてないと起動しない?
おそらく、コンポーネントにしないとUpdateされないから。
C# - UnityでStartCoroutineでNullReferenceExceptionをなんとかしたい|teratail
c# - starting Coroutine gives null reference exception in unity - Stack Overflow
unity - NullReferenceException in StartCoroutine method - Game Development Stack Exchange
一度に一つしかつかない可能性があったが、何かの間違いだと思う。
【Unity】ScreenSpace OverlayなCanvas上に3Dモデルを表示する - げぇむぷろぐらみんぐ
Invoke
手軽なコルーチン。
第一引数に実行するメソッド名、第二引数に実行するまでの時間を渡せる。ほかにも断続的実行なんかのおまけもある。
MonoBehaviour-Invoke - Unity スクリプトリファレンス
UnityのInvokeを使って一定時間後に処理をする | Unityを使った3Dゲームの作り方(かめくめ)
ただメソッドをStringでしか渡せないのがネック。nameof(メソッド)とすれば一応メソッド名を使える。
これ実際使うのはaction?.Invoke()の時くらいじゃないか。 拡張メソッドを使えば使えるけど、そこまでするならCoroutineでいいし。
async・await
UnityじゃなくC#。非同期処理を待つための機能。
上記二つはMonoBehaviourのメンバなので継承しないと使えないが、これは普通に使える。
ただしキャンセル周りがめんどくさいらしいのでUniTask・UniRx推奨。
awaitをつけると処理を待ってしまうので、非同期処理をするならawaitをつけずに実行する。Riderがこれに待ったをかけてくるのは、本来このasync・awaitがマルチスレッド実行のためのものであって非同期処理用じゃないから。
結局これが一番わかりやすい。
C# での非同期プログラミング | Microsoft Docs
Deep Dive async/await in Unity with UniTask(UniRx.Async) | Unity Learning Materials
C#の話。
C# 今更ですが、await / async - Qiita
さては非同期だなオメー!async/await完全に理解しよう | Unity Learning Materials
async
このメソッド内にはawaitがあるよ、と通知する表記。
await
これが完了するまで待つよ、という表記。
これをそのまま実行すると、メインスレッドの動きを止めてしまう。そこで、一度処理をTask型に入れることで処理を進めててもらう。
UniTask
UniTaskはUniRxから必要なものを抜き出したライブラリであり、現在はこちらの仕様が推奨されてるっぽい。UniRxも場合によっては使う。
また、UniTaskを使うとUniTaskTrackerというウィンドウがついてくる。
非同期処理の中身を見たい場合はお役立ち。
https://github.com/Cysharp/UniTask
初心者向けコルーチンの代わり?UniTask(UniRx.async)を使い方 - Qiita
UniTask機能紹介 - Qiita
【Unity】MonoBehaviourを継承していないクラスでコルーチンを使う(コールバックも) - はなちるのマイノート
UniTask入門 | Unity Learning Materials
UniTaskでレッツ非同期!
どちらを使うべきか。
UniRx&UniTask とは何なのか - Qiita
キャンセル
必須。ないとメモリリークしたりする。
OperationCanceledExceptionという例外を投げて止めるという、結構乱暴な方法を取っている。
仕様上、これはtry-catchで拾えるのでキャンセル時に実行したい処理がある場合は拾う。
【Unity】UniTask Coroutineとの違いとキャンセル処理の挙動 - Qiita
【UniRx.Async】UniTaskのキャンセル覚書【Unity】 - Qiita
【超基礎】async/awaitを使う上でUniTaskのキャンセルは例外処理である件 - 渋谷ほととぎす通信
.SuppressCancellationThrow
例外処理は重い。そこで、キャンセルメソッドにこのメソッドをつけることで例外処理をスキップできる。
また、戻り値としてboolを返してくれる。
【Unity】UniTaskのキャンセル処理まとめ・Taskとの比較 - LIGHT11
【UniTask】SuppressCancellationThrowを使ってキャンセルを戻り値として取り出す - はなちるのマイノート
なんか値が反映されない
処理スピードを上げるために別変数にシングルトンの値を入れているとき、Actionで別変数を渡したりすると、それをいくら変更しても反映する処理が別の場所にあるせいで反映されないということがある。
waitの種類
いくつかある。普通はDelayFrameとかで事足りる。
UniTask機能紹介 - Qiita
スキップしたい
WaitUntilと合わせてWhenAnyで結合。
UniTask.Delay にスキップ機能を追加する - GIGA CREATION Blog
フレームを固定したい
QualityのVsyncを切り、Application.targetFrameRateを調整すればいい。
Application.targetFrameRate
Debug.DrawRay
デバッグ用に可視化したレイが飛ばせるメソッド。
長さのほか、色や表示時間が変えられる。
Debug-DrawRay - Unity スクリプトリファレンス
Physics.Raycast
レイを飛ばし、コライダーにヒットした点をRaycastHitに格納するメソッド。2Dで使うならそれぞれ2Dの表記が必要。
最大距離はともかく、ちょっと厄介なlayerMask指定がある。
これは単なるint数値指定ではなく、どのビットがONなのかを見る引数。だから狙ったレイヤーをONにするならビットシフトが必要になる。
Physics-Raycast - Unity スクリプトリファレンス
Mathf
sinやcosの計算ができる関数群……だけではなく、線形補完やある間の数値をStepで進んでいくMoveTowards()、数値の間を行ったり来たりするPingPong() などいろいろ揃っている。
特にApproximatelyはよく使う
【Unity】便利な数学関数の Mathf クラスまとめ | 夜中にUnity
数学系の処理を扱うMathfの全変数と全関数【Unity】 - (:3[kanのメモ帳]
全Unity使いはMathfのリファレンスを読め - Qiita
Physics2D.OverlapCircle
接触判定をupdateで、かつ(自分の)colliderなしでできるメソッド。戻り値は一つのcolliderや、全てのcolliderのリストの数などが返せる。 GetContactsと同じく、引数にリストを設定すればそこに接触colliderリストを代入してくれるので、戻り値を常にもらう必要はない。
もしcolliderがついていた場合、自分自身のcolliderも検知する。
Physics2D-OverlapCircle - Unity スクリプトリファレンス
Unity - 衝突判定の複数感知|teratail
Unity 指定した座標がコライダー内部にあるか判定する - おねむゲーマーの備忘録
ContactFilter
結果をフィルタリングするのに使う構造体。
試した限りでは普通にNormalAngleを使うことはできず、IsFilteringNormalAngleを使う羽目になった。
trigger colliderの時はNormalAngleが使えないとか書いてるけど、IsFilteringNormalAngleでif分けする分には問題ない。
UnityEngine.ContactFilter2D - Unity スクリプトリファレンス
ContactFilter2D-useTriggers - Unity スクリプトリファレンス
LayerMask
あるレイヤーでしか反応しないようにしたいときに使う構造体。
GetMaskでレイヤー名を使用してフィルタリングする。レイヤー番号を名前に変換するLayerToNameもあるので、番号だけでもこの構造体は使える。
呼び出すときは暗黙的にintになっているので、実はビットシフトしたintで代用可能。そもそも、そのビット演算をやりたくないからこういうので代用してるんだけど……。
UnityEngine.LayerMask - Unity スクリプトリファレンス
EditMode
通常play中にしかスクリプトは動かないが、Editor内でも動かす方法がいくつかある。
【Unity】C#で点と扇形の内外判定の実装 (EditModeテスト付き) - Qiita
スクリプトを Edit モードで実行 - Qiita
Physics.SphereCast
ごんぶとレイキャスト。
じつはレイキャストにはいろいろな形があり、これはその一つ。
【Unity】SphereCastやBoxcastで、球や箱のあたり判定が通過できるか判断する - テラシュールブログ
Physics-SphereCast - Unity スクリプトリファレンス
Rigidbody.Velocity
速度ベクトル。
ここに数値を入れると、非現実的に物体を飛ばせる。
【Unity基礎】velocityを使用してオブジェクトを動かす方法 | ネコプロ
Rigidbody.AddForce()
物理的に物体を飛ばすときに使うほう。
Rigidbody2D-AddForce - Unity スクリプトリファレンス
GetComponentとインターフェース
たとえばプレイヤーが何かにダメージを与えたいとき。
それが何で、ダメージを与える機能がついてて、とか見ていく必要はない。
ざっくり言うと、インターフェースを使えば「ダメージを与えられる」という機能を抽象化して与え、「ダメージを与えられるやつ」で全て呼び出せるようになる。
public変数が減るので便利。
GetComponentを使うときはインターフェースを使おう
Application.isPlaying
現在アプリケーションが再生中かどうかを検知するブール。
if(!Application.isPlaying)とすれば、エディタの終了時に処理を挟める。
【Unity】エディタが終了する直前に処理を行う - Qiita
OnDrawGizmos()
デバッグ用にギズモを表示するためのメソッド。
スクリプトがゲームオブジェクトに設定されている間呼ばれる。
選択時に発動してほしいならOnDrawGizmosSelected()を使う。
UnityのGizmosを使ってシーンビューで視覚的なデバッグの補助をする | Unityを使った3Dゲームの作り方(かめくめ)
これをプリプロセッサで囲めばそこのコメントアウトだけで消せるし、ブールで囲めば簡単に可視不可視を切り替えられる。
Transform.SetParent
親を設定できるメソッド。
第二引数をtrueにすると、見た目の大きさや位置を維持して数値が書き換えられる。言い換えるとワールド座標系における位置と大きさが維持される。
反対にfalseにすると数値が維持される。 ローカル座標系の維持。
【Unity】Transform.SetParent の第2引数に渡す値によって何が変わるか - コガネブログ
Transform-SetParent - Unity スクリプトリファレンス
Camera.orthographic
カメラが正投影ならtrue、パースならfalseになる変数。
Camera-orthographic - Unity スクリプトリファレンス
Vector3.one
(1,1,1)を取得できる変数。スケールに便利。
実は.NET自身にも同じような変数があったりする。
同じようにVector3.zeroとすれば(0,0,0)が取れる。位置取りに便利。
Vector3-one - Unity スクリプトリファレンス
Vector3-zero - Unity スクリプトリファレンス
Vector3.One プロパティ (System.Numerics) | Microsoft Docs
Camera.orthographicSize
正投影カメラの縦半分のUnit数が入っている変数。
これを二倍して代入すれば、画面全体を覆う物体の縦スケール値が出る。横? Camera.aspect掛ければ出る。
Camera-orthographicSize - Unity スクリプトリファレンス
OrthographicのSizeとは - おがみたは衰退しました
Camera.aspect
アス比変数。幅÷高さ。
Camera-aspect - Unity スクリプトリファレンス
Transform.InverseTransformPoint
ポジションをワールド空間からローカル空間に変換する。
Transform.TransformPointはローカルからワールド。
ここでいうローカルは親子関係を作った時の親からの相対座標のこと。
Unityで透過動画を再生する
VP8で作ればkeep alphaをチェックするだけでいい。簡単。
ただしffmpegに入っていない可能性があるので注意。
またVP9は何故か対応してないので注意。
透過つきムービーをUnityのTimelineで再生する|よーへん(バーチャル学芸員・バーチャルライブコーダ)|note
【Unity】Video Playerでアルファチャンネル付きムービーを使う - テラシュールブログ
UnityのVideo Playerで使えるアルファチャンネル付き動画をAdobe Premiereで書き出す方法 - Qiita
AfterEffectsから透過動画を書き出してUnityで再生する - Qiita
[Unity ] 透過動画(WebM VP8)を作ったときのメモ - KYUCON*BLOG
【Unity】UnityのVideoPlayerで透過の動画を再生する方法 - めーぷるのおもちゃばこ
そのほか、シェーダーでα取って合成する方法もある。
Unityで透過処理することになるのでおそらくどんな動画も可能。ただ、それが調節できるかといわれると。
アルファチャンネルでない動画をUnityでクロマキー処理して再生する | パティオ
わりといけた。
CS Shader
シート一枚にまとめて静止画として再生する手もある。
これはおそらく仕事で描画負荷を減らす奴。
【Unity】エフェクト制作に必要な要素・機能・組み込みのまとめ | CGメソッド
Motion Graphics
なんかモーションできる。
物体を非表示したい
アクティブ変更
gameObject.SetActive(false);
Updateも無効化される。
ただこの処理自体は他より重い。
Renderer変更
gameObject.GetComponent<\Renderer\>().enabled = false;
ただ見えなくする。
α0
var color = gameObject.GetComponent<\Renderer\>().material.color
color = new Color(color.r, color.g, color.b, 0f);
マテリアルを変えるために、途中でマテリアルが複製される。
レイヤー替え
gameObject.layer = LayerMask.NameToLayer("Hidden")
事前にどのカメラからも映らないレイヤーを用意し、底にオブジェクトを入れる。
ちゃんとカメラのCulling Maskからチェックを外すこと。レイヤーが変わるので物理挙動も変えられる。
スケール0
transform.localScale = Vector3.zero
シェーダ負荷がほぼ0になり、子要素も消滅する。アニメーションで消したいときにこれでごり推すことも。
ただしスケールで0除算が起きる可能性あり。
大きさをスクリプトから変更
transform.localScale
。ワールドとか無く、これひとつ。
Unityスクリプト: オブジェクトを拡大縮小する (Transform.localScale)|まくろぐ
親の大きさに引っ張られる!
transform.SetParent
から、worldPositionStaysをfalseにしておく。
Transform-SetParent - Unity スクリプトリファレンス
region コメント
#endregion
と一緒に使い、コードエディタ上で折りたたむ部分にコメントをつけられる機能。
後でメンバを追加するとき、合った場所を見つけるのがめんどくさくなるので気を付ける。
regionを使わないほうがよい3つの理由と1つの例外 - Qiita
スクリプトからシェーダに情報を渡す
どうもこれはできるらしい。Materialの変数にあるとかなんとか。反対? たぶん無理。自分で考えろ。
[Unity] C#プログラム側からシェーダに値を渡す - Qiita
Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition + Vector3.back*Camera.main.transform.position.z));
2Dでマウスポジションを取るときに使う。
Vector3.backは(0,0,-1)なので、カメラのz位置と掛けてマウスポジションを足すと、zだけ0にしたマウスポジションを取れる。
Sceneには映るのに、カメラに映らない!
十中八九カメラのCulling Maskです。
レイヤーを追加した後はちゃんと設定しましょう。
action?.Invoke()
actionでdelegateやるときに、そのactionがnullじゃないなら実行するよ、という書き方。
C#6.0以前は自前でnullチェックが必要だった。
null チェックをいちいち書かないで action を実行する方法 - Qiita
nullチェックしないなら普通にaction()で呼び出せる。
なお、action?()は不可。
タグ検索
タグでシーン内のゲームオブジェクトを検索するエディタ拡張 - Qiita
標準機能をくれ。
TextMeshProが使えない
using TMPro
TextMeshPro temp
TextMeshProの使い方 - Qiita
タイマーの値が増えない
Time.deltatimeが小さすぎる?
初速度なら初速度じゃないの?
最低速度にしないと摩擦に負ける。
C# Job System
【Unity】C# Job Systemを自分なりに解説してみる - テラシュールブログ
ECS
ゲームオブジェクトの進化系。
ゲームオブジェクトをまとめて統括制御する。
勉強会レポ : Unity ECS完全に理解した - Raspberlyのブログ
var
暗黙的型付け。
右側で型が決まるという意味であり、動的型付けを定義するDynamicとは違う。
Tile
エディタ上では有能なのに、スクリプト上では初見殺しまみれというくっそ面倒な奴。
【Unity】タイルマップ - Tilemap クラスでよく使う関数 - コガネブログ
UnityのTilemapで心折れかけたことと解決のためのプレビュー拡張 - Qiita
tilemapが使えない
using UnityEngine.Tilemaps
が必要。
初学者にやさしくない。
The type or namespace name “Tilemap” could not be found - Unity Forum
一部のタイルを消したい
GetContactsでContactPoint2Dのリストを取得。
それを自分と破壊相手と両方で取得し、Intersectで積集合リストを取得。
その一つ一つのポイントに対しWorldToCell()でTilemap上の場所を特定し、SetTile()でnullを代入すれば消える。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
using System.Linq;
[RequireComponent(typeof(Rigidbody2D))]
public class PlayerCtrl : MonoBehaviour, IDamagable, IChangeScore, IInvincible
{
private void OnCollisionEnter2D(Collision2D other)
{
if (!PlayerDeepData.Entity.stateBools[PlayerDeepData.StateKeys.jumpAttacking] &&
!PlayerDeepData.Entity.stateBools[PlayerDeepData.StateKeys.dashAttacking]) return;
if (!other.gameObject.CompareTag("BreakBlock")) return;
var contactPointOther = new List<ContactPoint2D>();
var contactPointPlayer = new List<ContactPoint2D>();
var breakBlock = other.gameObject.GetComponent<IBreakable>();
other.GetContacts(contactPointOther);
rigid2D.GetContacts(contactPointPlayer);
foreach (var v in contactPointOther.Intersect(contactPointPlayer))
{
breakBlock.breakThis(v);
}
}
public void breakThis(ContactPoint2D c)
{
//Destroy(gameObject);
var tilePos = tilemap.WorldToCell(c.point);
tilemap.SetTile(tilePos, null);
}
}
ほぼクリティカル。
【Unity】TilemapでRayが衝突した場所のTileを消す - YAMADA TAISHI’s diary
タイルマップをゲーム中に書き換える処理【Unity,Tilemap】 | あのゲームの作り方@わたぶろぐ
Unity/Tilemapで、スクリプトから一部のtileを当たり判定含めて消してみた - Qiita
検索してもExceptばっか出てきて大変だった。
最初から積集合って分かってればな。
[C#] Linqの演算で和集合, 差集合, 積集合 を求める方法 │ Web備忘録
C# で 2つのリストを比較する | Delft スタック
C# - C# List同士の比較|teratail
このブラシでゲームオブジェクトも配置したい
できます。
【2D Tilemap Extras】タイルマップにゲームオブジェクトをぺたぺた貼れるGameObject Brush【Unity】 | ゲーム開発65535 Ver2
TileMap.GetInstantiatedObject
なんかnullばっか出るのは、GameObjectがStart()の後の最初のフレームでインスタンス化されるから。
この仕様上、これを実行するのはStart()のタイミングですら早すぎる。 そのためboolを使ってUpdateにinitメソッドを作るのがいい。
……のだが、2020.3ではそもそもこのメソッドが仕事しない。 2019で仕事しないって話はあったけど、なんで2020でも動かないんだよ。
だからTileからはスプライトを拾って、別にゲームオブジェクトを作ったほうがよさそう。
How to use TileMap.GetInstantiatedObject? - Unity Answers
[TileMap] How to get the Instantiated Object of all tiles ? - Unity Forum
.GetTileData()にITilemapが欲しいのにどこにも
.GetTileData()はUnityが使う機能。 というか、ITilemapが絡む関数は全部Unityが内部で使うものであって、ユーザーが触れるものではない。あとTileDataも。
もしかしてリファレンスってソースを読む人のためのものであって、メソッドを使う人のためじゃない……?
How to Get ITilemap From Tilemap · Issue 44 · Unity-Technologies/2d-extras
How do I get iTilemap to pass by reference? - Unity Forum
さぁ、UnityのTilemapを始めよう!4/8 Tile について編 - Qiita
歩いてるとクッソ引っかかる
Composite Colliderで合体する。
タイル破壊については場所を指定してnull代入してるので問題ない。
あおぞらノート: 【Unity】TilemapCollider2Dの間に引っかかる件
壁に引っかかる
摩擦をゼロにしたphysicsを割り当てる。どうもNoneとゼロ割り当ては別物らしい。
片っぽに付ければ済むので、プレイヤーに。
ステージ作成&「引っかかり問題」の解決 | Unityでゲームを作ろう!
Prefab Brushがない
何故かはわからないが、そういうScriptableObjectを作らないと使えない。
Create→2D→BrushesからPrefab Brushを選択するとSObjができ、Tilemap Editorで扱えるようになる。
たぶん、だいたいGameObject Brushで済むから隠したのだと思う。
Prefab Brush Missing · Issue 252 · Unity-Technologies/2d-extras
visualizing prefab brush · Issue 315 · Unity-Technologies/2d-extras
直接的な答えではないが、察することが出来る。
Animation
テキストアニメーション
TextMeshPro限定だが、こういうのがある。
【Unity】TextMesh Proをアニメーションさせる~デザイナー編~ - コポうぇぶろぐ
本当は専門のTypeface Animatorというのがあったのだが、なんか見つかんないので。
他のアニメーションがしたくなった時用に、プログラマ編も載せておく。
【Unity】TextMesh Proをアニメーションさせる~プログラマ編~ - コポうぇぶろぐ
2D ボーンアニメーション
sprite EditorとAnimation Editorを使うということさえ分かっていれば、何も難しくない。
【Unity】2D Animationの基本的な使い方 psd(psb)ファイル読み込みからSkinning Editorまで - Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご
Anima2Dでキャラクターアニメーションを作ろう!編 - SEGA TECH Blog
スプライトエディタのボーンがシーンに出ないんだが
スプライトオブジェクトにsprite skinコンポーネントをつけてCreate Bonesをクリックする。
たったこれだけなのになぜか解説されないシリーズ。
2D Sprite Editor bones aren’t visible in scene - Unity Forum
sprite animation
アニメーションパターンをSceneに放り込めばAnimationとなる。
ClipのLoop設定は忘れず。
スプライトアニメーションは速度をClip内のSamplesで変えられる。
Unity でスプライトアニメーションを作る - Qiita
ちなみにスプライトだけ入れ替えるならスクリプトが必要。
上の記事のリンク参照。
UnityでSpriteアニメーションを画像差し替え可能な実装をする - QUEST LAB
アニメーション謎項目
UnityのAnimator ControllerのSpeed、Mirror、Foot IK項目 | Unityを使った3Dゲームの作り方(かめくめ)
スプライト反転
Sprite Rendererの中のMirror。
他にもY軸で回す手法もあったり。
How to flip sprite horizontally in Unity 2D? - Unity Answers
アニメーション遷移
アニメーターにフラグをつけ、スクリプトでAnimationをとり変更する。
実はidで入力したほうが早いらしい。
【Unity】Animator.SetBool(int id, bool value)について | TEAM ARASHIYAMA Blog
State Machine Behaviour
Enter,Update,Exit,RootMotionとIK関係が実装できる。
アニメーションの切り替わりと何かを同期させたいときに。
【Unity】State Machine Behaviour について - KAYAC engineers’ blog
Animation Event
アニメーション中に関数を実行できる。
アニメーション中に判定をつけたいときに。
[Unity] Animation Eventを使いこなそう! - Qiita
Avator Mask
アニメーションの一部ブレンド機能。
例えば上半身と下半身に別のアニメーションを付与し、複合アニメーションを作ることが出来る。
【Unity】レイヤー・アバターマスクを用いてアニメーションを複数同時に再生する – XR-Hub
Any State
どんな時でも、条件が満たされた瞬間にそのアニメーションに遷移させるステート。たとえばゴールモーションなどに使う。
UnityのAnimatorControllerをスクリプトで切り替える!Anystateからキー入力で切り替え | 神部まゆみのブログ
Layer Weight
アニメーションをレイヤーで上書きできる機能。
Anyのように元に戻す遷移を書かなくて済むので、2Dだと神機能。
上書きだけでなく加算もできる模様。
UnityのAnimatorのレイヤーのSyncを使ってアニメーションを全て変更する | Unityを使った3Dゲームの作り方(かめくめ)
Trigger
一度だけ再生するアニメーションに対して設定する変数。
銃の発砲などにぴったり。
unity - Animator Bool or Trigger? - Game Development Stack Exchange
Auto Live Link
Animatorがくっついてるオブジェクトを選択していないと働かない。
2D アニメーションプレビュー
Prefabに入れてPrefabを選択していないとモデルが無くてプレビューできない。
【Unity】2DのSprite Animationをプレビューする裏技 - テラシュールブログ
Write Defaults
起動時の位置やパラメータを覚えておき、アニメーションキーが設定されてないところでその値を使用する設定。
これが外れていると、アニメーションを止めた際に元の値に戻らなくなる。
これには罠があり、GameObjectをアクティブにした瞬間の値がデフォルト値になる。 Animatorをつけたオブジェクトは不用意に非アクティブにしてはいけない。
これはUnity5の時代の話であることも留意。
【Unity】知らないと面倒くさい事になるかもしれないAnimatorの「Write Defaults」の動作について - テラシュールブログ
アニメーションとスクリプト、両方移動
AnimationControllerにrotationやpositionを動かすカーブがあると、他のアニメーション再生時にもそれらを初期値に戻すアニメーションが設定される。 つまりAnimationでしか設定できなくなる。
対策として、値を常に代入式で突っ込めばいい。
回転の場合はちょっとめんどくさいが。
これはUnity5の時代の話であることも留意。
【Unity】Animatorで動かすオブジェクトをスクリプトでも動かす際の注意 - テラシュールブログ
停止する
普通にanimator.speed = 0f
とかやると、Animator配下のアニメーションが全部止まる。
ので、Multiplierを設定してSetFloatで掛け算調整する。
UnityのMecanimで個別のAnimationを一時停止する - Qiita
フレームレート変更
ドットメニューからサンプルレートを表示してやれば変更可能になる。
[解決済み]アニメーションフレームレートの設定-Unityフォーラム
DOTween
ちょっとしたアニメーションが簡単に書ける。
アニメーションを連続させて繋げたりするときなんかに有用。
Unity DOTween 入門 - Qiita
DOTween - Documentation
SetEase
TweenerおよびSequenceのアニメーションカーブを設定できる。
デフォルトはLinearで等速直線。
UnsetとLinearは別物。
普通のアニメーションカーブも指定できる。
DOTween-ドキュメント
Easing Functions Cheat Sheet
TimeLine上でプレビュー
できなくはない。
TimeLineのキーで普段アニメーションをつけているなら、ぜひ。
DOTweenのアニメーションをTimeLineでプレビューする - PG日誌
カウントダウン・カウントアップ
普通にDoTween.Toで実装してもいいが、Textに直接アクセスするコードがある。
DOTweenでカウントダウン・カウントアップのアニメーション - Qiita
SequenceのPlay
DOTween.To
値だけを純粋に変更するtween。
何でもできる。
DOVirtual
何が仮想なのかというと、たぶん値を先に設定してること。
DOVirtual.DelayedCall
関数実行にディレイをかけるだけのtween。
UniTaskもCoroutineもいらないのでおそらく最も手軽。
DoVirtual.Float
DoTween.Toでfloat使うのと大体同じことが出来るtween。
使う値ごとに別のメソッドを使うのがめんどくさいが、ラムダ式が一つで済むのでシンプルに書ける。
【Unity】unity1week「回」で使った小技集|ピクジン|note
進行中のアニメーションにAppend
出来ないらしい。
どうしてもするなら、AnimationQueieを使う。
すでに再生中のシーケンスに追加・Issue#132・Demigiant / dotween
拡張エディタ
【Unity】エディタ拡張の際によく使用する、基本的なクラスや関数まとめメモ | Bard は楽して暮らしたい
Enumの名称替えは使えそう。
【Unity】UnityEditor で利用できる Field 一覧 - うにてぃブログ
大前提
拡張エディタまで来ると、データの保存方法が問題になることがある。保存したつもりが保存されてなかったりする。
これはおそらく、SerializeObjectのせい。Unity内ではSerializeされたものはすべてこの型に入れて管理されている。inspectorを通せばそのSerializeObjectを通して値が変更されるので、値が変更されたことをUnityが検知してセーブできる。
しかしシーン上でのデータを使ってクラス内からSerialize値をいじると、Unityはその値が変更されたことを検知できない。よって再生時などに前の値に戻ってしまうことになる。
Editor拡張 - Windowを作ろう - Qiita
【Unity】EditorUtility.SetDirtyのなく頃に - 徳島ゲーム開発ごっこ 技術ブログ
じゃあどうすんだというと、クラス内からもSerializeObjectを通せばいい。ちなみに上記のシステム上、SerializeObjectを通すとSerializeした値にしかアクセスできない。private変数をセーブしたいときは[SerializeField, HideInspector]という属性を使う。お前使い道あったのかい。
さらに値の変更前にserializedObject.Update()
を呼ばないと、前回の値のままで更新されない。変更後はserializedObject.ApplyModifiedProperties()
を呼ばないとセーブできない。
serializedObject.ApplyModifiedProperties()
の効果により、Serialize値をそのままいじったものはいじる前の値でセーブされたりするので、これを使う場合は全てSerializeObjectを通すのがデフォになる。
インスペクター拡張の基礎|UnityでコードからGUIを作る
Editor拡張 - SeriazliedObjectに迫る - Qiita
個別にセーブもできるらしいが。
Unity 意外と楽しいエディター拡張 ~シリアライズって何?編~ - おねむゲーマーの備忘録
色
テキストとかならGUI.Colorを書き換えればいいが、ボタンならGUI.backgroundColorを変える。
変更するとその後の記述全てに影響するので注意。
How do I change the color of a GUILayout button? : Unity3D
Foldout
折り畳み。実装できる。
開閉状態も取れる。
データリスト
しっかりしたものも作れる。
【Unity:エディタ拡張】エディタでデータリスト表示をしてみよう - Qiita
Scene View Camera
SceneView.currentDrawingSceneViewで、SceneViewというScene関係のクラスが取れる。それに.cameraをつければScene Cameraが取れる……筈なのだが、うまくいかず。
Resolved - How to draw certain gizmos only in Scene view, but not in Game view - Unity Forum
それにこれだとGameViewを開いた瞬間にObject not setが出るので、.lastActiveSceneViewを使うことに。
Moving scene view camera from editor script— - Unity Forum
Unity - Scripting API: SceneView
エディタでボタン押したときに情報を拾って、プレイ時に処理する
エディタを実行していない時にSceneView上でクリックした座標を取得する【Unity】 - (:3[kanのメモ帳]
Inspectorにメソッドを実行するボタンを追加する【Unity】【エディタ拡張】 - (:3[kanのメモ帳]
【Unity】エディタ拡張でエディタを自由にカスタマイズしよう!~インスペクタビュー編~ – XR-Hub
【Unity:エディタ拡張】Unityでエディタ拡張を始めよう - Qiita
How to get mouseposition in scene view? - Unity Forum
UnityのGizmosを使ってシーンビューで視覚的なデバッグの補助をする | Unityを使った3Dゲームの作り方(かめくめ)
この辺から生成。
public void fallBlock(ContactPoint2D c)
{
foreach (var i in gd)
{
var tileIntPos = Vector3Int.CeilToInt(i.Key);
if (tilemap.HasTile(tileIntPos))
{
tilemap.SetTile(tileIntPos, null);
}
var gObj = Instantiate(spResource);
gObj.transform.position = i.Key + new Vector3(0.5f, 0.5f, 0);
var spTemp = gObj.GetComponent<SpriteRenderer>();
spTemp.sprite = i.Value;
}
}
#if UNITY_EDITOR
private void OnDrawGizmos()
{
if (first)
{
gd = new GenericDictionary();
first = false;
}
if (!toggle) return;
Vector3 mousePosition = Event.current.mousePosition;
mousePosition.y = UnityEditor.SceneView.lastActiveSceneView.camera.pixelHeight - mousePosition.y;
mousePosition = UnityEditor.SceneView.lastActiveSceneView.camera.ScreenToWorldPoint(mousePosition);
var tilePos = stattilemap.WorldToCell(mousePosition);
if (Event.current.type is EventType.MouseUp)
{
Debug.Log("座標:" + tilePos.x.ToString("F2") + " , " + tilePos.y.ToString("F2"));
if (!gd.ContainsKey(tilePos))
{
gd.Add(tilePos,stattilemap.GetSprite(tilePos));
}
}
Gizmos.color = new Color(1f, 0, 0, 0.3f);
foreach (var i in gd)
{
Gizmos.DrawWireCube(i.Key + new Vector3(0.5f,0.5f,0), new Vector3(1, 1, 1));
}
}
#endif
}
[CustomEditor(typeof(Piller))]
public class PillerSwitch : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
GUI.backgroundColor = Piller.toggle ? Color.blue : Color.red;
if (!GUILayout.Button("Select Tile")) return;
Piller.toggle = !Piller.toggle;
Debug.Log(Piller.toggle);
}
}
見ると何のことは無く、割と簡単に実装できる。
EditorGUILayout.Popup
シリアライズしたenum変数のように、文字列配列をプルダウンメニューにする関数。
OnInspectorGUIなどで 呼び出した瞬間に シリアライズされ表示される。つまりこの関数内で戻り値を返す処理とシリアライズ処理が同時に走っている。
引数にとるintは文字列配列に渡すindex。なので、固定値を渡すとその値の文字列にしかならなくなる。たとえば3を渡せば配列の[3]を返し、他に変えようとしても変わらない。
戻り値はintで、ここにプルダウンで変更した値が入る。
つまり、戻り値を引数と揃えないと正しくプルダウンにならない。初見殺しじゃけえ……
EditorGUILayout-Popup - Unity スクリプトリファレンス
【Unity】択一選択式プルダウンメニューを動的に変化させる【エディター拡張】 - Tsuの雑記¯_(ツ)_/¯
【Unity】UnityEditor で利用できる Field 一覧 - うにてぃブログ
【Unity(C#)】文字列リストをEnumっぽく使うエディタ拡張 - Qiita
複数の型を含んだシリアライズ変数
辞書型
昔からシリアライズ辞書の需要は強く、いろんな人がいろんな方法で作ってきた。
[Solved]How to serialize Dictionary with Unity Serialization System - Unity Answers
SerializedDictionary
URPプロジェクトでだけ使える、Unity純正のシリアライズ可能な辞書型。
正確にはUnityEngine.Renderingに入っている。
なお、テスト版なのかUIが重なっているし2020.3ではInspectorから数値を変えると辞書サイズまで変更されるのでもう諦めていいんじゃないかな。
使い方は簡単、using UnityEngine.Rendering;してからdictonaryをこれに変えるだけ。
Serialized Dictionary Lite
現在のプロジェクト、Destroに使ってるやつ。
実際はvalueに構造体を指定している。
Serialized Dictionary Lite | ユーティリティ ツール | Unity Asset Store
構造体
クラスをシリアライズする際と同じく、[Serializable]をusing System
と一緒に付ければ宣言時にシリアライズされる。
なにかと構造体はめんどくさいので、Csharp Cheat Sheetの構造体を読み込んでおくこと。
【Unity】Inspector上で構造体のパラメーターを設定可能にする | りつかのゲーム開発雑記ブログ
二次元配列のシリアライズ
手としてはリストをクラスに入れ、そのクラスをリスト化するというのが一般的っぽい。
多次元のListをInspectorに表示する【Unity】 - (:3[kanのメモ帳]
凝りたいなら海外フォーラムを探す。
Serialize custom multidimensional array from Inspector - Unity Answers
Showcase - How I serialize multidimensional arrays - Unity Forum
Is there any way to view 2d arrays in the inspector? - Unity Answers
Dictionaryのforeach
keyvaluepair型というものを使う。
.keyや.valueとすればそれぞれ読める。
C#でKeyValuePairを使用する - プログラムを書こう!
0除算
物理演算とタイミングが合わず、完璧に止まったタイミングで早さの割り算が開始され0へ。
FuncとAction
戻り値があればFunc。なければAction。
Funcは16個まで引数を持てる。
定義済みの関数を入れる際は名前だけで()は使わない。
C#のActionの使い方。Funcとの違いやデリゲートの解説 | .NETコラム
SVG
マスターのvector-graphics-samples / vectorgraphics.md・Unity-Technologies / vector-graphics-samples
Class VectorUtils | Vector Graphics | 2.0.0-preview.18
UIにしたら見えなくなった
preview18で修正されてるらしい。
それでもだめなら、右クリック→SVG Imageから自分で設定すれば見れるかも。
Unity UI SVG support script | Page 3 - Unity Forum
扇形が欲しい
ないので作れ。
Unity-ベクターグラフィックプレビューパッケージ| 20ページ-Unityフォーラム
TryGetComponent
GetComして存在しないならばfalseを返すメソッド。
取れたコンポーネントはoutを使って渡した引数内に渡される。
TryGetComponentとout、out var のお話 - Qiita
Cinemachine
カメラにブレインを仕込み、それを通してvirtualカメラの映す情報を次々切り替えるシステム。
キャラクタを追わせたり、パスに沿わせたりできる。
【Unity】Cinemachine入門!スクリプトなしでカッコいいカメラワークを作る - LIGHT11
ユニティちゃんを撮影するカメラをCinemachineで制御する|npaka|note
Dolly Camera
2Dで扱う場合、トラックパスはカメラより手前にないと正常に動かない。
【Unity】【Cinemachine】Virtual CameraのTracked Dollyでパスに沿ってカメラを動かす - LIGHT11
【Unity】Cinemachine Mixing Cameraで複数カメラをブレンドする | ねこじゃらシティ
Class CinemachineTrackedDolly | Package Manager UI website
Mixing Camera
カメラを切り替えるのに使うカメラ。
最大8個。
【Unity】【Cinemachine】最大8個のカメラを一度にブレンドできるMixing Camera - LIGHT11
Transposer
基本の目玉機能。
Followにとりあえず指定しておけば、対象を追うカメラは作れる。
当然だが、動く対象を指定すること。オブジェクトを纏めてるだけのオブジェクトを指定しても動かない。
【Unity】【Cinemachine】Virtual CameraのTransposerで対象を追いかけるカメラを作る - LIGHT11
Extension
Extension欄がない
たぶんNullReferenceが出てるので、プロジェクトを二バイト文字が含まれない場所に移す。
Confiner
カメラを制限する空間を指定する。
ぶっちゃけこの記事だけで事足りる。
Unity 2Dアクションを作ろう【カメラをプレイヤーに追従】 | ゲームの作り方!
Game CI
Unityゲームをリポジトリにプッシュするだけでビルドしてくれる機能を提供する。
公式チュートリアルはまず説明から入っており、貼り付けるだけで動くやつは一番下にある。ちゃんと読め。
当たり前だが、やる前に一度ローカルでビルドしてエラーは消しておく。
GameCI で Unity の CI 環境を GitHub Actions で構築する
流れ
activationのキーをもらいHubにアップロード、TestRunnerをunityVersionだけ追記して実行、builderでversion追記、webglだけにしてJamesIves/github-pages-deploy-actionを使いbuild/WebGL/WebGLを出力、gh-pagesを設定から公開。
lab版ならvariablesのUNITY_VERSIONを修正する。公開はpagesアクションのonlyをmainに修正すれば動く。
ulf
中身をテキストとして開いて貼り付ける。
unityVersion
ProjectSettingsから読み込んでくれるはずなのに、たいていうまくいかないので必須のオプション。
projectPath
.とか/.とか出てくるが、同じ階層にあるならそもそも要らないらしい。
Setting path for CI/CD in Github - Unity Answers
exit code 1
検索するとたまに出てくる、customParameters: "-nographics"
は古い対処法。
いまは要らないので消しておく。
Docker exit code 1 · Issue 182 · game-ci/unity-builder
exit code 103
WebGLで発生。ローカルでカラースペースやGraphics APIなどのグラフィックス設定を修正すると直った。
Unable to parse Build/[File Name].framework.js.br
WebGLの成果物である.brファイルをサーバーが読めないときのエラー。
サーバーの管理者なら設定すればいいが、そうでないならPlayer→Publishing SettingsからDecompression Fallbackにチェックを入れる。
こうすることで、デコンパイラを同梱してくれるため読めるようになる。パフォーマンスは落ちるらしいが。
ヘルプ募集-[解決済み] WebGLビルドエラー-「ビルド/ [ファイル名] .framework.js.brを解析できません」-Unityフォーラム
Create Artifact Container failed: Artifact storage quota has been hit. Unable to upload any new artifacts
Artifact、つまりビルドの生成物はどんどんたまっていく。そして無料アカウントだと月500MBしか溜められない。
対策としては、ビルドの後にその生成物を消去するアクションを入れるなど。
GitHub Actionsのストレージ容量 - みーのぺーじ
衝突モード選択
物をすり抜けてほしくないときに設定する項目。
最適な衝突判定を即選択。Collision Detection 早見表【Unity 2018.3 以降】 | VirtualCast Blog
Collision
collision
OnCollisionEnterとかにくっついてくる、ぶつかった物体の情報が格納される変数。これに.gameObjectをつければぶつかったGameObjectを取ることが出来る。
UnityEngine.Collision - Unity スクリプトリファレンス
Body Typeを変える
Rigidbody2D.bodyTypeに入ってるので、RigidbodyType2D.任意 で代入書き換え。
RigidbodyType2D - Unity スクリプトリファレンス
OnTrigger/OnCollisionExitのタイミング
普通に出ていったときはもちろん、対象のレイヤーを変えて衝突させなくしたときも反応する。
特定のものだけぶつからせない
レイヤーを切り替える方法が一般ぽい。
リンクでは拡張機能を使ってるが、LayerMask.NameToLayer()で名前をレイヤー値に変えるのは可能。
特定オブジェクト同士の当たり判定を一時的に無くす【Unity】 - (:3[kanのメモ帳]
また、その特定にしかぶつからないならトリガーを消すという方法もあることを書いておく。
ぶつかった時に物理的に跳ね返す
Dynamicじゃないと跳ねませんよ。
そのうえ、DynamicじゃないとOnCollisionEnterも動かない。
子オブジェクトの衝突まで検知するんだが
親にRigidbodyがついてると子オブジェクトの衝突を検知する。
【Unity】 子オブジェクトの衝突が検知される条件 - Qiita
CollisionとTriggerの違い
ざっくり言うと、どっちも動くならCollision。それ以外ならTrigger。
Collisionはどちらか片方にRigidbodyがないと動かない。
また、子のCollisionは親にRigidbodyくっつけてると反応する。
分けたいなら子にもRigidbodyをくっつけてると子の反応だけになる。
子ごとに判定を分けたいなら親に処理を書いて、子のOntriggerからtransform.root.gameObject.GetComponent<hogehoge>().BodyHit();
などで読み込むスクリプトを変えればいい。
[Unity] Unityにおける衝突判定まとめ - Qiita
OnTriggerEnterとOnCollisionEnterの違い / 衝突判定 - Unityメモ
【Unity】子オブジェクトにRigidbodyをアタッチして親オブジェクトを移動させたときの動作 - のりかつおの備忘録ブログ
【Unity】当たり判定が反応しない原因 - ユニツール
衝突点判定
【Unity】物理演算を(なるべく)行わずにオブジェクトの衝突位置を取得する方法 | ゴマちゃんフロンティア
衝突判定を行う方法 (Collider / Collision Detection) [Unity] – Site-Builder.wiki
Physics.GetContacts()
colliderに触れている全てのcollider・rigidbodyの配列・リストや、その接触点の配列・リストが取れるメソッド。
戻り値はintで配列・リスト数を返してくれる。もちろん、もらわなくてもいい。
istouching
Unity - Scripting API: Physics2D.GetContacts
【Unity】Raycastを使わず地面に接触しているか判定する - テラシュールブログ
注意点として、Collisionを引数にとった場合と、Collider、Rigidbodyを引数にとった場合では取れる値が違う。 Collisionが一番詳細に取れる。(Rigidbody Dynamicしか試してない)
Collider、Collision、Rigidbodyにも同名の関数があるが、この値関係も同じ。それぞれの値はPhysicsで取る場合と等価。
接触点を返すものであり、OnTriggerEnterを完全に互換はしない。
また、最大の罠としてTriggerだと使えない。 お願いだからそういうことは書いとけよ書いてたわ。
Unity - OnTriggerEnter2Dでの接触場所取得の方法|teratail
Collider.ColosestPoint(Vector3)
指定した場所に対して、コライダー内で最も近い点を返す関数。
数少ないTriggerで接触点を取れる可能性だが、Tile相手ではそもそもその指定した場所が欲しいので意味がない。
Collider-ClosestPoint - Unity スクリプトリファレンス
c#-トリガーから連絡先を取得するにはどうすればよいですか? - スタックオーバーフロー
Unity 指定した座標がコライダー内部にあるか判定する - おねむゲーマーの備忘録
【Unity】物理演算を(なるべく)行わずにオブジェクトの衝突位置を取得する方法 | ゴマちゃんフロンティア
KinematicとStaticの衝突判定
設定から少し変えれば衝突を拾ってくれるようになるらしい。
ただ、そもそもKinematicで衝突させるにはRigidbody.MovePositionで物体を移動させるなどのひと工夫が必要。いつも通りtransform.positionでやるとすり抜けてしまう。なおtransform.positionは別の話。
キネマティックリジッドボディにリジッドボディのないコライダーとの衝突を検出させる-UnityAnswers
Physic Manager> Contact PairsModeは変更を加えていないようです[2018.1.9f2] -Unityフォーラム
[Unity初心者Tips]どれが良いかわかる!ものを動かす方法はこうして決める - Qiita
Unityでプレイヤーを移動させるときは、本当にAddForceが良いのか - Qiita
Rigidbody-MovePosition - Unity スクリプトリファレンス
ただ、どうやら今はチェックを入れる場所が違うっぽい。
KinematicにしたRigidbody2Dの設定項目にuse FullKinematicContactというのがあり、これをONにすれば使える。
Unity-マニュアル:Rigidbody 2D
ちなみに、当然だがKinematicなのですり抜ける。
止めたいならDynamic一択。
Freeze Position
スクリプトによる操作も受け付けなくなる。
public static な Scriptable
このクラスが持つフィールドもすべてstaticにすることになる。
すると、そのオブジェクトが存在していようがいまいが常にメモリに残り続けることになる。メモリ圧迫になるので止めろ。
重み付きランダム
float Choose (float[] probs) {
float total = 0;
//渡されたfloat配列をすべてtotalに足す
foreach (float elem in probs) {
total += elem;
}
//ランダムな値とtotalをかける
//これは全確率に対してランダムにダーツを投げたのと同じ
float randomPoint = Random.value * total;
//float配列の数だけ繰り返す
for (int i= 0; i < probs.Length; i++) {
//もしランダム値とトータルの掛け算が現在のfloat配列に当たるなら、floatを返す
if (randomPoint < probs[i]) {
return i;
//存在しないなら、現在のfloat配列ぶんランダム値を引く
else {
randomPoint -= probs[i];
}
}
//どこにも存在しないなら、float配列の最後の値を返す
return probs.Length - 1;
}
確率の値を用意し、そのすべてを足し合わせ、0からその合計まででランダムな値を出す。
そしてランダムな値より確率の値が大きいとき、その確率の値を返す。小さいならランダムな値から確率の値を引く。イメージはテープをどんどん切ってく感じ。
この方法だと、確率は合計が100でなくてもいい。
全体に対する双対的な大きさが重要になる。
ランダムなゲームプレイ要素の追加 - Unity マニュアル
【Unity】UnityのRandomを使って重み付き抽選を実装するサンプル │ エクスプラボ
ただ、これは離散確率変数なので、10-100の間でランダム値、さらに重みづけ、とかしたいときにできない。(連続確率変数)
それをやるならAnimationCurveを使う。
【Unity】なんとカーブと乱数を使って確率を決められるらしいぞ! │ エクスプラボ
辞書から最大値や最小値を検索
【C#】Dictionary から最大値や最小値を持つ要素を検索する方法 - コガネブログ
【LINQ】FirstOrDefaultでリストの最初の要素を取得する | さんさめのC#ブログ
Post Process
そのエフェクトをかけるカメラにPost-process Layerをつけ、エフェクトをかけるレイヤーを指定する。カメラとレイヤーの二つの制限をここでかける。
Triggerはしらん。ここで指定したオブジェクトがEnableになったらエフェクトをかけるようにする、とかだろうか。
次に、適当なオブジェクトにPost-process Volumeをつける。Canvasにじかに付けてもいいし、管理用に別オブジェクトに付けても構わない。ただしLayerで指定したレイヤーのオブジェクトじゃないと機能しない以上、これをつけたオブジェクトには必ずエフェクトがかかることには注意。
【Unity】ポストプロセシング(Post-Processing)を使ってプロ級の画面に │ エクスプラボ
Bloom
光らせるための処理じゃなく、粉塵を飛ばして光を目立たせるような処理であることは留意する。HDRカラーで眩しさを設定しないと光らない。
カメラの表示をレイヤー的に重ねたい
Depth調整。そしてDepth Onlyにすれば透ける。
Unity3Dで、カメラを複数使ってレイヤー表示みたいにする方法 | ssdkfk
動画を光らせたうえでクロマキーしてαを調整したい
- RenderTextureをCreateしておく
- Unity公式ページから、自分のバージョンのUnityのビルトインシェーダーをダウンロードする
- UI-Default.shaderをプロジェクトに導入し、編集する。シェーダーの名前、PropertyにHDRのColor変数、float3の同名変数を設定して、OUT.color.rgbに変数を+=で足し合わせればいい。
- できたシェーダーをアタッチしたMaterialを用意
一旦ここまで。次は実際にUnity世界を光らす。
-
PostProcessingをPackageManagerからインストール。(光らす用のパッケージ)
-
カメラにPost-process Layerを取り付け、Layerにエフェクトが影響するレイヤーを設定
-
Canvasを追加(RenderTextureはUI要素なので、Canvasがないと表示されない)
-
Canvasの子にRawImageオブジェクトを追加
-
CanvasとRawImageのLayerをさっきPost-process Layerで指定したレイヤーに変更
-
適当なオブジェクト(Canvasでもいい)にPost-process Volumeを取り付ける
-
Profile→New、Add Effect→Unity→Bloomで光る
ここまででBloomのIntensityを上げてみて、画面全体が光ればOK。
ここから光を動画だけにまとめる。 -
RawImageオブジェクト内にVideoPlayerを取り付ける
-
VideoPlayerのVideoClipに動画を設定
-
RenderModeをRenderTextureに(動画を加工できるよう、RenderTextureを介してRawImageに表示する)
-
TargetTextureに予めCreateしておいたRenderTextureを設定
-
RawImageのTextureに同じRenderTextureを設定
-
RawImageのMaterialに、初めに作ったMaterialを設定
ここまでで、シェーダー内に用意した値をInspectorからいじれば光具合が調整できるようになる。
最後にクロマキーとαシェーダーをこのシェーダーに追加。以下のコードをうまいこと追加する。
Shader "UI/Glow"
{
Properties
{
_KeyColor("Key Color", Color) = (0,1,0)
_Near("Near", Range(0, 2)) = 0.2
_Opacity("Opacity", Range(0, 1)) = 0.0
}
SubShader
{
Pass
{
CGPROGRAM
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
float4 worldPosition : TEXCOORD1;
half4 mask : TEXCOORD2;
UNITY_VERTEX_OUTPUT_STEREO
};
half _Opacity;
fixed3 _KeyColor;
fixed _Near;
fixed4 frag(v2f IN) : SV_Target
{
half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
fixed4 c = tex2D(_MainTex,IN.texcoord);
clip(distance(_KeyColor, c) - _Near);
color.a = c.a;
color.a = _Opacity;
#ifdef UNITY_UI_CLIP_RECT
half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
color.a *= m.x * m.y;
#endif
#ifdef UNITY_UI_ALPHACLIP
clip (color.a - 0.001);
#endif
return color;
}
ENDCG
}
}
}
keycolor, near, opacityを置いた後、clipで作った画像でα抜き、return予定のcolor変数のα値である.aに.aを追加する。その後改めて透明度を追加。
元コードがsurfaceに対してこちらではfragmentを使うため、uv_テクスチャ名が使えない。代わりにv2f構造体に入ってるTEXCOORD0を使用する。
ここまでできれば、抜け具合をkey-colorとnear、透明度をopacity、光をEmissionとPost-process VolumeのBloomで調整できるシェーダーが完成する。ナガカッタ
[Unity]uGUIをBloomを使って光らせ、EmissionColorも設定できるようにする - Qiita
アルファチャンネルでない動画をUnityでクロマキー処理して再生する | パティオ
uvどこだよってなった時に見つけた
サーフェスシェーダーでfloat4uvを有効にする方法は? -Unityフォーラム
けっきょくいらなかった、スクリプトでα制御する奴
Unity画面にウェブカメラの画像を半透明で重ねて表示 | STYLY 開発者ブログ -STYLY Developer’s Blog-
他の光らす方法
unity3d - Opacity in Unity Shader - Stack Overflow
【Unity】目やパーツの一部を光らせる - テラシュールブログ
【Unity】Fragment ShaderにEmissionを適用する - Qiita
ボタンでシーン読み込み
オブジェクトに読みたいメソッドを書いたクラスを貼り付け、ボタンのOnClickに登録すればいい。
貼り付ける以上、MonoBehaiviourは必要。
【Unity】ボタンを押したら任意のシーン(scene)を読み込みようにする方法 | Unishar-ユニシャー
typeof()とGetType()
typeof
言語機能。コンパイル時に決まっている型しか取れない。
GetType()
たぶんメソッド。内部でリフレクションを使うので遅い。
RunTimeType
Typeに対してGetType()を実行すると取れる、Typeの具象クラス。
しかしGetComponent<>()したものにGetTypeを実行しても取れる。まあ確かに中身はクラスだ。
そしてこのRunTimeType、Type型に入るくせに変数に入れていてもセーブされない。 普通に困る。
なので、「オブジェクトにくっついてるクラスを別オブジェクトに持っていきたい」ときは、MonoBehaviour型にでも入れておこう。
GetComponent.<T> () and System Type.GetType() - Unity Forum
stringからクラス名にする手もある。
c# - How to convert string to any type - Stack Overflow
【Unity】クラス名からTypeを取得する - テラシュールブログ
リフレクション-C#のSystem.TypeとSystem.RuntimeTypeの違いは何ですか? - スタックオーバーフロー
c# - Test if Convert.ChangeType will work between two types - Stack Overflow
Convert.ChangeType メソッド (System) | Microsoft Docs
TypeConverter クラス (System.ComponentModel) | Microsoft Docs
Light2D
2D世界でlightを使うシステム。
URPで使える。
使うにはURPのグラフィック設定を上書きする必要がある。
Create → Rendering → Universal Render Pipeline → Pipeline Assetで出来たScriptableObjectにCreate→Rendering→URP→ 2D Renderをデフォルトとして割り当て、Edit→Project Setting→Graphics→Scriptable RP SettingsにPipelineを割り当てる。
Can’t use URP 2D Lights - Unity Answers
I can’t use 2D lights - Unity Answers
2D Lights greyed out, only have experimental 2D renderer in create menu : Unity3D
初めてのライト操作!初心者のためのURP導入 Unity2D | workpress
古いウィンドウズみたいにスプライトが重なる
画面更新されてないのが問題なので、背景を設置する。
Addressable
Resourceフォルダはアプリが重くなったり追加ロードできなかったりで非推奨なので、AssetBundleが使いたい。けど使うのがめんどくさい。
そこで、Resourceに代わる新たなアセット読み込み方法として出てきた技術。2018.3以降。
【Unity】僕はそろそろResourcesフォルダを卒業しようと思う - LIGHT11
Addressable Assets Systemを完全に理解する - Qiita
ResourcesのシンプルさとAssetBundleの自由度を実現したAddressable Assetsとは【Unity】【Addressable Assets】【Unite 2018 Tokyo】 - (:3[kanのメモ帳]
ResourcesのシンプルさとAssetBundleの自由度を実現したAddressable Assetsとは(脱Preview記念リライト)【Unity】【Addressable Assets】 - (:3[kanのメモ帳]
Addressable Assets Systemをちゃんと導入するための技術検証まとめ – てっくぼっと!
名前を変えてもパスで同じくアクセスできたり、プロファイラがあったり、サーバとローカルの読込先をカンタンに変えられたりするのが強み。
読み込みが非同期であることと、アセットの登録とビルドが必要であることに注意。
アセット登録は結構手作業なので、短縮したいならEZAddresserを使う。
ちなみに右クリックでSimplifyできる。
Haruma-K/EZAddresser: Automatic addressing system for Unity Addressable Asset System.
[Unity] Resources.Loadの代わりにAddressable Asset Systemを使ってみる - Qiita
1.17以降なら同期ロードもできる。しかし一つの処理に同期ロード指定しても、全てのロードが終わるまで待機する仕様があるので使うならよくよく考える。
表記には三行必要なので、短縮したいならAddlerを入れる。
【Unity】Addressableアセットシステムで同期ロードが公式サポート、Resources.Loadを置き換え可能に - LIGHT11
Haruma-K/Addler: Preloading, Pooling, Lifetime Management for Unity Addressable Asset System.
また0.6.6で大きく仕様が変わったらしく、調べても新しい名称が出ないことがある。
ざっくりとした名称はこちら。
めんどくささから解放!AddressableAssetSystemの最新情報と使える小技! - Qiita
流れ
Addressableにアセットを登録し、パスを編集してスクリプトから非同期で読みだす。
オブジェクト破棄時など、Releaseを忘れず。
非同期操作
そのままだと読み込みが終わらないうちに処理が進んでしまうので、.Completedコールバックを使うか、awaitで.taskを待つか、コルーチンを使うか。
ちなみにWebGLはマルチスレッドが使えないのでawaitできない。
非同期操作の処理| アドレス可能| 1.5.1
【Unity】Addressableアセットシステムで同期ロードが公式サポート、Resources.Loadを置き換え可能に - LIGHT11
アドレス可能なアセットの読み込み| アドレス可能| 1.18.19
Group
Content Update Restriction
アプリを更新しないと更新できないリソースかどうか設定する項目。
これをCannotにすると、リソースビルド時にNew Buildにしないと更新されない。
この設定はダウンロードコンテンツ用にある。詳細はこちら。
【Unity】【Addressable】Addressableアセットシステムにおけるコンテンツ更新ワークフローまとめ - LIGHT11
LoadAssetAsync
LoadAssetの新記述。たぶん、非同期であることをより明確に示すために変わった。
アドレスとラベルは区別されない。key指定にはどちらも入る。そのため、アドレスとラベルが被ると意図しない読み込みが発生する。
LoadAssetsAsync
複数版。必ずコールバックを渡す必要がある。要らないならnull。
本当に”s”を追加しただけであり、非同期なせいでどれが最初のオブジェクトになるかわからない。
【Unity】Addressablesのラベル機能を使ってアドレスをグループ化する - LIGHT11
Addressableでラベルを使って複数のアセットバンドルを一括で読み込みたい - ロバメモ - 素人のUnity覚書と奮闘記
アセットの登録関係
バンドルをまたいで依存関係がある場合は、自動的に一緒にロードしてくれる。
DownloadDependenciesAsync
旧名PreloadDependenciesAsync。こっちで検索しないと出ない情報もある。 0.6.6以降で変わる。
アセットをプリロードして、実際にロードする時間を短くする機能。第一引数にはアドレスかラベル、第二引数はプリロードしたものを直後にアンロードするかどうかのboolを渡す。
Addressable Assetsで事前ロードしたい :: Kuro Tech Blog — 調べたもの置き場
【Unity】Addressable Asset System で事前ダウンロードする方法 - コガネブログ
内部的には一度LoadAssetAsyncしてReleaseしてるだけらしい。
ソースを見たが
else
{
var handle = LoadAssetsAsync<IAssetBundleResource>(GatherDependenciesFromLocations(locations), null, true);
if (autoReleaseHandle)
handle.Completed += op => Release(op);
return handle;
}
こんな感じなのでたぶんマジ。
なら何の意味があるのかという話だが、これはDLCの更新時に必要。DLCだけ更新しても、リクエストが出されるまでローカルの情報は更新されない。
このメソッドを実行すれば、ローカルにキャッシュが残るので次からDLする必要が無くなり速くなる。
【Unity】【Addressable】Addressableアセットシステムにおけるコンテンツ更新ワークフローまとめ - LIGHT11
AssetReference
読み込むアセットをInspectorから指定できるようにするとき、シリアライズする型。
ポップアップから選べる。
AssetReferenceT
AssetReferenceTypeRestrictionの代替。
膨大なアセットをAssetReferenceから選ぶのは(検索機能があっても)非現実的なので、元はAssetReferenceTypeRestrictionで型を指定していた。
しかし0.6.6で廃止されたので、代わりにこれを使う。
といってもこれはメソッドではなく、ジェネリッククラス。Unityではジェネリックを使用したクラスはシリアライズできないので、これを継承したクラスをつくりAssetReferenceの代わりに使う。
【Unity】AddressableAssetSystemのAssetReferenceで、一覧表示するアセットを任意の型に制限したい - テラシュールブログ
ここにも書いてるが、AssetReferenceLabelRestrictionも廃止された。こちらは今はAssetReferenceUILabelRestrictionとしてアクセスできる。
ClearDependencyCacheAsync
指定されたキーとその依存関係において、キャッシュされたAssetBundleを消す。アプリの容量をコントロールするメソッド。
注意点として、現在のコンテンツカタログで動くので、コンテンツカタログを更新してしまうとうまく消去できない。その場合は期限切れになるまでキャッシュが残り続ける。
PrefabUtility.GetPrefabInstanceHandle
そのオブジェクトが何のPrefabから生成されているかを返してくれるメソッド。
すごい役に立つかと思いきや、PrefabUtilityがUnityEditorのクラスであること、Prefab自体は返さないのでInstantiateできないこと、一番親のPrefabのデータを返すことが相まってあまり使えない。
元の用途は二つのオブジェクト同士で実行し、戻り値を比較することで同じPrefabかどうか調べるもの。
Unity - Scripting API: PrefabUtility.GetPrefabInstanceHandle
c#-プレハブとGameObjectを比較するにはどうすればよいですか? - スタックオーバーフロー
MatCap
別にUnityに限った話じゃないが。
ライティングの結果をテクスチャから受け取る手法。光の加減に関係なく陰影をつけることが出来る。
注意点として、ライトの影響を基本受けないこと、視点に寄らずライトの方向が一定になることなどがある。
それでも極めれば肌すら作れる、結構すごい技術。
【Unity】Matcap、事前に用意した綺麗な光表現を利用する - テラシュールブログ
Assembly Difinitions
別々のアセンブリにモジュールを分割、管理できる機能。
Unity Assembly Definition 完全に理解した - Qiita
【Unity】Assembly Definition Filesという神機能 - テラシュールブログ
初めに
差分ビルドでコンパイルが早くなること、特定のプラットフォームでのみコードを有効化できること、ライブラリ干渉を最小限にできることなどが利点。最後のは名前空間やクラス名が被っても問題なくなる。
adfを使い始めると、従来のアセンブリは全てAssembly-CSharpという一つのdllにまとめられる。adfはこれを分割していく。
adfでは個々のアセンブリに関して参照関係を設定する必要がある。
設定した参照関係に対して逆方向の参照や、参照からの参照は不可。 常に明示的に設定しないと参照できない。
また、Assembly-CSharpからは全てのアセンブリを参照できるが、全てのアセンブリから参照できない。
使い方
分割したいファイルが入っているディレクトリ内に、adfファイルを置くだけ。
設定
Auto Referencced
チェックが入っているとAssembly-CSharpから参照されるため、常にコンパイルされる。
Define Constrains
Player Settingsでビルドするかどうか決められる。
ちなみにこの技術が入ったことにより、なかなかやばいことができるようになっていたりする。よっぽど突っ込んだことやらないと関係ないけど。
SerializableクラスのSerializeField Color変数が保存されない
newするからじゃないですかね。
newするとクラスから新たなインスタンスが作られる。
つまりクラス内に存在しない、Unityで用意したデータは使われないということになる。
だからsingletonとかScriptableObjectとかJsonとかいろいろ使って最初に読み込むし、MonoBehaviourつけたやつはNewするなって怒られる(SerializeFieldがついてたら初期化してしまうから)んですね。
実際、Serializableクラスを書いて、その変数をSerializeFieldにするだけでnewをしていないと初期化はされない。
intでもstringでも問題ない。
対処法はクラス外に書くか、staticにするか、ScriptableObjectやJSON使うか、コンストラクタで初期化するくらいだろうか。
Colorがシリアライズできないという、2014年くらいの問題は全く関係ない。今のUnityは普通にシリアライズできる。
Colorをシリアル化できません。 —Unity Answers
SceneLoad時に読み込む関数のデリゲート
Unity側ですでに用意されている。
SceneManager.sceneLoadedに関数を追加してやればいい。
アンロード時ならSceneManager.unSceneLoaded、
ロードとアンロード両方ならactiveSceneChanged。
【Unity】シーンの切り替えを検出するイベント | TECH PROjin
自分用Unityメモ:シーンロード時に処理を行う - かさたな日記
DOVirtual.DelayedCall
Invokeみたいなやつ。
ラムダ式で指定するので引数も使える。
URP世代のBloom
URPそのものにPost Processing機能が含まれている。
使い方は簡単、Volumeを用意しAdd OverrideからBloomを選ぶだけ。
従来のポスプロとは互換性は無い。こちらを使うのみ。
なお、一部だけ光らす場合はThresholdをHDRに合わせるしかないっぽい。ボリュームマスクを合わせれば行けるという話もあるが?
URPの後処理ボリュームは特定のレイヤーで機能しますか? —Unity Answers
【Unity】PostProcessingStackのBloomで「特定の物体だけ」を光らせる方法 - のたぐすブログ
【Unity】URPでポストプロセス(Post-processing)を使う手順 - はなちるのマイノート
ひかりものを表現する | hassakulab.com
Unity URP のポストプロセッシング|npaka|note
今までのも使えないわけじゃないらしいが、互換性機能。
【Unity】UniversalRPでカスタムポストプロセスを作る【ZoomBlur】 - Qiita
Vector3Int.FloorToInt
Vector3をVector3Intに変えるメソッド。
名前の通りこれは切り捨て。切り上げや銀行家の丸めが使いたいときはそれぞれCeilToIntやRoundToIntが存在する。
Vector3からVector3Intおよびその逆-UnityAnswers
【Unity】Mathfの切り上げ、切り捨て、偶数丸め。使い分けが大事よね │ エクスプラボ
オブジェクトプール
別にUnityに限らないが、ゲームあるある。
オブジェクトの生成と破壊はコストが高いため、先に非アクティブの弾を用意。使用時だけアクティブにして使う。
加えて、画面外に入った弾は非アクティブにして使いまわそうという案。2021から標準機能で実装された。
[Unity]簡単にオブジェクトプールを作る - Qiita
Unity 2021から利用できるUnity標準のオブジェクトプールについて | Yucchiy’s Note
現在のシーン名
SceneManager.GetActiveScene().name。
【unity入門】現在のScene名を取得する方法 | もぎブログ
Transform.localPosition
親がいるときに子の座標で移動したい、ってときにつかうやつ。
これを使う前はいちいち親ポジションから自分の場所を計算していたので、移動スピードが間に合わず親が先にぶつかることがあった。
GameObject.FindWithTag().GetComponent<>();
FindWithTagがnullだとそのままエラーになる。
エラーを防ぐために、いったんFindWithTagで拾ったものを変数に入れてnullチェックしておくといい。
イベントドリブン
何かの処理が起きた時、同時に処理を走らせるもの。
仕組みは単純。
- Actionに関数を入れる
- 処理の最後にAction?.Invokeを入れる
これで関数を実行した際にActionが一緒に実行される。
計算コストが抑えられるが、後から状態だけ変更した際なんかに監視できずうまくいかなかったりする。
Object .FindObjectOfType
普通のFindよりも広く、初めに見つけたアクティブなTypeを返す関数。
言うまでもなく超遅いので、
Object-FindObjectOfType - Unity スクリプトリファレンス
RigidBodyの固定変更
rigidbody.constraints
にEnum型であるRigidBodyConstraintsを代入すればいい。
ただし、これらだけだと「X軸と回転」の固定などに対応できない。その辺の複合Freezeは**|を使いOR演算で生成する。**
Unity で rigidbody の位置,回転の固定をスクリプトから変更する | Lonely Mobiler
Camera Stacking
オーバーレイカメラをどのカメラに重ねるか選べるURP機能。
複数のカメラに同じオーバーレイカメラを設定することもできる。
Camera Stacking | Universal RP | 7.2.1
壁越しのUI
普通にカメラスタッキングを利用して別カメラに映したものをオーバーレイする。
Unity UI設定:RenderModeについて Screen Space Overlay , Screen Space Camera , Screen Space World - Qiita
Render Textureを使う方法もあるが、重い。
【Unity】ScreenSpace OverlayなCanvas上に3Dモデルを表示する - げぇむぷろぐらみんぐ
Input.anyKey
あらゆるキーに対して押されているかどうかを確認する。
Input-anyKey - Unity スクリプトリファレンス
Awake Start OnEnable
オブジェクトが無効だと呼ばれない。
Awake
- スクリプトを無効にしても呼ばれる。一度だけ。
- Instantiateした時点で関数処理に割り込んで呼ばれる。
Start
- Awake、OnEnableが終わった後、最初の画面更新が行われる前に呼ばれる。
OnEnable
- アクティブ化した時点で関数処理に割り込んで呼ばれる。何度でも。
- Instantiateした時点で関数処理に割り込んで呼ばれる。