うにてぃブログ

主にUnityとC#に関する記事を書いていきます

2020-06-01から1ヶ月間の記事一覧

【Unity】カメラの深度テクスチャを手軽に確認する

カメラの深度テクスチャを確認する場合ポストエフェクトのコンポーネントを作成し 深度テクスチャを取得して表示する Shader を作成する必要がある が多少面倒なので、手軽に確認できる方法を記述する PostProcessing 手軽に確認するために PostPorcessing …

【Unity】Text と TextMeshPro の違い

Text と TextMeshPro の違いを同じ機能の部分のみ簡単にまとめる UI 表示 Font Atlas Text TextMeshPro 文字色 Shadow Text TextMeshPro Outline Text TextMeshPro UI 表示 TextMeshPro のフォントはズームしてもきれいに表示され 文字の周りをぼかすには Fo…

【Unity】OnTriggerStay の呼び出し頻度

以前 OnTriggerStay で一定時間 特定の範囲にいる際に処理をしたくて 以下のコードを書いていたのですが、想定した挙動にならなかった public class SampleMonoBehaviour : MonoBehaviour { [SerializeField] private float _targetTime; private float _tim…

【Unity】Time クラスの static 変数

たまに扱いを間違うのでメモ Time.timeScale Time.deltaTime Time.fixedDeltaTime Time.time Time.fixedTime Time.unscaledDeltaTime Time.fixedUnscaledDeltaTime Time.unscaledTime Time.fixedUnscaledTime Time.smoothDeltaTime Time.realtimeSinceStartu…

【Unity】uGUI Text のバッチング

uGUI では Hierarchy の上にあるものから順番に描画される この際に同じ Atlas の場合 バッチングされる そのため間に Text をはさんだ場合バッチングが途切れると思っていたが 特定のケースでバッチングされることがあったのでそれについてまとめる ※Unity2…

【C#】2進数の1の数をカウントする

C#

どこかで拾ってきた処理だとは思うが、いつか使うかもしれないのでメモ こちらのページにて解説してる人がいたので、詳細はこちらから intの1のビットの数を数えるロジック | mwSoft public static int GetBitCount(int x) { x = (x & 0x55555555) + ((x >> …

【Unity】オブジェクトを回転させつづける

using UnityEngine; public class RotateObject : MonoBehaviour { [SerializeField] private Vector3 speed; private void LateUpdate() { transform.Rotate(speed, Space.Self); } }

【Unity】Preset 機能

Unity 2018からPreset機能が導入された これを利用することで、コンポーネントの初期値を設定することができる Image の Raycast TargetTarget はすべて true にする必要が無いので デフォルトで false にする等の利用方法が想定できます Preset Manager - U…

【C#】string 結合のGC

文字列結合時の GC を調査してみました 文字の長さが短いかつ何度も計測しているわけではないのでこれが正しいかどうか分かりません 単純な結合より string.Formatのほうが GC が少ないと思っていたが string.Format は結合が早い分 GC が多い模様 // 0B var…

【C#】Dictionary をソートする

C#

Dictionary を key 順にソートしたくて、調べていると SortedDictionary というものがあるみたいでした docs.microsoft.com 使い方 例えばこのようにすると foreach で取得する際にはソートされて取得できます var sortedDictionary = new SortedDictionary<int, string>(</int,>…

【Unity】特定のコードの Profiling を行う

コードをプロファイリングするために Profiler.BeginSample Profiler.EndSample が用意されている Unity - Scripting API: Profiling.Profiler.BeginSample コードのプロファイリングするには以下のように記述すればいけますが private void Awake() { Profi…

【Unity】サイコロの上面を判定する

サイコロの出目を知る方法として、角度を求める等あると思いますが 各目の位置に Transform を設置し、各 Transform の y 座標が一番大きな要素を出目として判定してみる サイコロにはAssetStoreから無料のこちらを利用する Dice Pack Light | Packs | Unity…

【Unity】撮影したテクスチャにテクスチャを合成する

hacchi-man.hatenablog.com 以前作成したものに、テクスチャの合成を追加しました 処理的には単純で 合成するテクスチャのアルファを見てもとのテクスチャと混ぜるだけです この際にテクスチャの ReadWriteEnable が有効でなければ合成できません for (int x…

【Unity】Array の サイズ変更

UnityEditor UnityEditor 上でのみの配列操作なら ArrayUtility が利用できるのでこちらを利用します UnityEditor.ArrayUtility - Unity スクリプトリファレンス using UnityEditor; private void ArrayControl() { int[] _array = new int[0]; // 追加 Arra…

【Unity】UnityEvent に関して

Button 等 uGUI の要素には 押されたときなどのイベントをハンドルするために UnityEvent が利用されています UnityEvent にはイベントを登録する方法として下記の2つの方法がある Inspector から GameObject と メソッドを指定 Script から イベントを登録 …

【C#】for と foreach

C#

パフォーマンス 0~10000までを加算して計測する private class Test { public int Value; } private void Main() { List<Test> _list = Enumerable.Range(0, 10000).Select(i => new Test(){Value = i}).ToList(); var sum = 0; Profiler.BeginSample("ProfileFor"</test>…

【Unity】Surface + Vertex Shader

Surface Shader の頂点処理を差し込む場合は pragma の最後に指定してやれば良い #pragma surface surf Lambert vertex:vert Shader "SurfaceVert" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossi…

【C#】配列をString化して返す

C#

using System.Collections.Generic; public static class ListUtil { public static string Display<T>(this IList<T> self) { if (self == null || self.Count <= 0) return ""; var builder = new System.Text.StringBuilder(); builder.AppendLine("[Display IL</t></t>…

【Unity】AddComponent Menu に コンポーネントを表示させない方法

AddComponent Attribute の 引数を空文字列にすることで AddComponent Menuで検索しても出てこなくすることができる 親クラスに記述していても、継承先でも記述しなければ一覧に表示されるので すべてを表示したくない場合は継承先にも記述する必要がありま…

【C#】for と Enumerable のパフォーマンスを調べる

下記コードを実行して速度等を見てみる ループの上限が60000なのは Enumerable.Range 側で大きい値を入れると OverflowException: Arithmetic operation resulted in an overflow. のエラーが出てしまったため private void Start() { Profiler.BeginSample(…

【Unity】Hierarchy 上の Transform の順番を操作する

Transform.GetSiblingIndex 現在の順番を取得できる using UnityEngine; public class TransformGetSiblingIndex : MonoBehaviour { private void Awake() { Debug.Log(transform.GetSiblingIndex()); } } Transform.SetSiblingIndex 指定した順番に変更する…

【Unity】Z-Depth が取得できないことがある

カメラの Z-Depth を利用する Shader を記述していると一部オブジェクトで Z-Depthが取得できないことがあった 調べてみると Unlit Shader の場合は Z-Depth が取得できないようでした 理由も調査したのですが、詳しい理由はわかりませんでした・・・ 対応 …

【Unity】TextMeshPro の Font Material を外部からロードする

TextMeshPro を利用していると FontMaterial が大量にできてしまったりして、管理が面倒になってくるので 外部からロードできれば楽になることがあるのではと思い実装の調査をしてみました TextMeshPro の Font Material Font Material の 差し替えを行うこ…

【Unity】vert_img を使った 頂点処理の記述を省略したシェーダー

UnityCG.cginc 内に vert_img という頂点処理用のメソッドが用意されているので 頂点とuvしか利用しない場合こちらを利用したほうが手軽で行数も少なくなる struct appdata_img { float4 vertex : POSITION; half2 texcoord : TEXCOORD0; }; struct v2f_img …

【Unity】ライティングが無効な Surface Shader

Surface Shader でライトを無効にしたいことがあり、作成 左側がライトが有効なもので、左側がライトが無効なものです Shader "Custom/UnlitSurf" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" }…

【Unity】ランタイムでカメラに映しているものを保存する

ランタイムでカメラの写してる画像を保存しようとしてもタイミングを考慮しないと 正しく画像を撮影することができません そのため WaitForEndOffFrame でレンダリングの完了を待つ必要があります yield return new WaitForEndOffFrame(); コード レンダリン…

【C#】Stateを管理するクラス

C#

State を enum で分けて管理しているとき クラスが増えていった際に 追加処理が面倒だったので自動的に管理してくれるものを作成 using System; using System.Collections.Generic; using System.Linq; public class ClassManage<T, TEnum> where T : BaseClass where </t,>…

【Unity】どうぶつの森のような曲がった世界を作る

どうぶつの森のような曲がった世界を Unity で再現してみたかったのでやってみます あつまれ どうぶつの森 | Nintendo Switch | 任天堂 計算式 ある点から進むにつれて頂点の座標を下図グラフのように下げてやれば 同じようにできるはずなので、これをもとに…

【C#】配列の要素を入れ替える

C#

using System.Collections.Generic; public static class ListUtil { /// <summary> /// Replace Index1 and index2 /// </summary> public static void Replace<T>(this IList<T> self, int index1, int index2) { if (self.Count <= index1 || self.Count <= index2) return; var ca</t></t>…

【Unity】特定の範囲にランダムでオブジェクトを配置するコンポーネント

範囲や配置するアイテムサイズを指定して、重複しないようにもしくは完全ランダムで配置することが可能なコンポーネントです 重複不可時はどうしても配置できない場合は非表示にします using System.Collections.Generic; using UnityEngine; using Random =…