うにてぃブログ

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

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

【Unity】SpriteRenderer を FillAmount する

uGUI の Image は IMeshModifier を利用すれば、頂点座標や uv の変更ができました しかし、SpriteRenderer では Sprite の頂点座標や uv を利用しているため変更ができません そのため、Shader を利用して FillAmount を実装する必要があります 使い方 Spri…

【Shader】NoScaleOffset プロパティ

Unity で Unlit の Shader を作成すると以下のテンプレートコードが生成される ※ 本来は Fog の設定があるが消している Shader "Unlit/NewUnlitShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" }…

【C#】文字列の先頭を小文字に変換する

C#

// ABCD => aBCD public static string ToTopLower(string value) { if (value.Length <= 0) return string.Empty; return char.ToLower(value[0]) + value.Substring(1); }

【C#】文字列とその他の変数を結合する際には ToString が不要

例えば string と int を結合する際には iValue は ToString する必要が無い var sValue = ""; var iValue = 10; string text = sValue + iValue; おそらく private void operator+ (string a, object b) みたいな実装になってると思って Reference Source …

【C#】Reflection 処理まとめ

メモがてらまとめる 子クラスかどうか 親のクラス インナークラスの取得 継承クラスを全検索 インスタンス生成 すべての Type の中から検索 メソッド実行 static なメソッドを実行 プロパティ取得 static なプロパティ取得 ジェネリックメソッドの実行 メソ…

【Unity】LineRenderer の Width について

LineRenderer の Width は widthCurve という変数で AnimationCurve になっている これは Positions の 開始位置から、終了位置までのその点での位置で AnimationCurve.Evaluate して Width を計算していると思われる そのため、Positions の数が AnimationC…

【C#】for ループの i++ と ++i は IL 的に差があるのか

昔 for は i++ じゃなくて ++i を使おうって言われたことがあった気がしたので 実際に IL でどう違うのか調べてみました for (var i = 0; i < 10; i++) { } for (var i = 0; i < 10; ++i) { } IL を見てみる i++ がこちら IL_0007: ldloc.0 IL_0008: ldc.i4.…

【Unity】Sprite を Mesh に変換する

Sprite は vertices, uv, triangles と Mesh の情報を持っている これを利用して Sprite から Mesh を生成する Sprite の Mesh を正しく取得するためには Mesh Type を Tight にする必要がある Sprite Mesh の確認 SpriteRenderer を に対象の Sprite をセッ…

【Unity】Transform の子供一覧を取得する

Transform の子供一覧を取得する方法は2つあり 一つは childCount を取得して GetChild で取得する方法 for (var i = 0; i < transform.childCount; i++) { var child = transform.GetChild(i); Debug.Log(child.name); } もう一つは transform を foreach …

【Unity】CustomEditor 作成時にスクリプトの参照を Inspector に表示する

base.OnInspectorGUI を呼び出さない場合は、スクリプトの参照を表示できないので スクリプトを修正するさいに、クラス名から検索する必要があり面倒 using UnityEditor; using UnityEngine; public class SampleMonoBehaviour : MonoBehaviour { [Serialize…

【C#】ジェネリックメソッドをリフレクションで呼び出す

ジェネリックメソッドを呼び出す場合は MethodInfo から MakeGenericMethod を利用して、再度 MethodInfo を取得する必要がある public class Sample { public void Exec<T>() where T : class { Debug.Log(typeof(T)); } } 例えば上記クラスの Exec メソッドを</t>…

【Unity】法線マッピングを使ってみる

法線マップ(Normal Map)(Bump mapping) - Unity マニュアル 公式にあるように法線 (Normal) マッピングとは、法線マップを利用してモデルの表面に凸凹や、傷などを付ける技法 上記のリンクより画像をそのままお借りしますが、石垣のテクスチャに対して …

【Unity】EventSystems の イベントを親に通知する

EventSystems の イベントは子供の要素で呼び出されるため、親には伝わらない 例えば ScrollView の中に ScrollView を入れた場合は子供の ScrollView しか動かすことができない 親にイベントを伝える 同じ GameObject だったらイベントを受け取れることを利…

【Unity】UnityHub で未インストールの Unity をインストールする

UnityHub で追加したプロジェクトに対応した Unity がない場合 ⚠ マークが表示される この際に Unity - Download Archive から対象の Version を探してインストールするのが手間だったのですが ⚠マークをクリックするとフッターに インストール UI が表示さ…

【Unity】Canvas の overrideSorting がスクリプトから変更できない

using UnityEngine; public class SampleMonoBehaviour : MonoBehaviour { [SerializeField] private Canvas _canvas; public void Init() { _canvas.overrideSorting = true; _canvas.sortingOrder = 10; } } 上記コードを他のインスタンスが呼び出した際に…

【C#】for ループ内 で Action や コールバックなどで index を利用した際に、最終的な値になる件について

例えば 下記のコードを実行すると 結果は 10 になる using System; using System.Collections.Generic; public class C { public static void Main() { var actions = new List<A>(); for (var i= 0; i < 10; i++) { actions.Add(new A(() => {Console.Write(i)</a>…

【Unity】Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which c

Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale…

【Unity】IEventSystemHandler を持つコンポーネントがオブジェクトに複数あった場合の挙動

IEventSystemHandler を持つコンポーネントがオブジェクトに複数あった場合 どういった挙動になるのか気になったので ボタンと下記コンポーネントを同じオブジェクトに追加して どんなログが出るかを確認する using UnityEngine; using UnityEngine.EventSys…

【Unity】Text の中身を編集できる Attribute

セットした Text の中身を書き換えられたら便利なことがたまにあると思い作成してみました 使い方 using UnityEngine; using UnityEngine.UI; public class SampleMonoBehaviour : MonoBehaviour { [SerializeField, Text] private Text _text; } コード usi…

【Unity】Animator を逆再生する

Animator で Animation を逆再生するには speed に -1 を入れればできそうに思えますが これは動作せず最後のフレームを実行した状態で動きません そのため別の方法で逆再生させる必要があります _animator.speed = -1; _animator.Play("Death", 0, 1f); 逆…

【Unity】unity 用の gitignore ファイル

github に unity 用の gitignore ファイルが置かれているので、これを利用するのが便利です gitignore/Unity.gitignore at master · github/gitignore · GitHub DL する場合は こちらのコマンドから curl https://raw.githubusercontent.com/github/gitignor…

【Unity】下にスペースを追加する Attribute

通常 スペースを入れる場合 [SerializeField] private Button buttonPlay; [SerializeField, Space] private Button buttonReverse; 上 にスペースが追加されます が 下に スペースを追加したかったので EndSpaceAttribute を作成しました [SerializeField, …

【C#】パラメータの変更を監視するクラス

C#

HPゲージなど、パラメータが変更されたタイミングで UI に反映する必要があり、 そのパラメータの利用箇所が増えると処理が複雑になっていく そのため、汎用的に利用できる監視クラスを作成しました ※UniRx を使えば簡単に利用できるあれですが… using Syste…

【Unity】反転させた画像をクリック可能にする

通常 uGUI の 画像を Y で反転するとクリックしても反応しない そのための方法として、以前描画する 頂点座標を拡張コンポーネントで変更する方法を記述した hacchi-man.hatenablog.com がもっと簡単にできたので紹介する それは GraphicRaycaster の Ignore…

【Unity】Hierarchy 上で選択したオブジェクトのもつ RaycastTarget をすべて false にする

uGUI では UI最適化 にあるように、Raycast が不要な オブジェクトに対して Raycast Target をつけることは最適とされていません しかし Unity はオブジェクトを生成時にデフォルトで true にしてしまうためわざわざチェックを外すのが面倒になる そのため、…

【Unity】球の内部に点が存在するかを判定する

using UnityEngine; public static class MathUtil { /// <summary> /// (x - a)^2 + (y - b)^2 + (z - c)^2 <= r^2 を計算 /// </summary> /// <param name="targetPos">対象となる店</param> /// <param name="center">円の中心</param> /// <param name="radius">半径</param> /// <returns></returns> public static bool IsInSphere(V…

【Unity】C# から Android の Enum を利用する

C# では内部的に enum は int として扱っているので GetStatic<int>() で取得できそうですが、これではエラーになり取得できません そのため enum を取得する場合は GetStatic<AndroidJavaObject>()を利用します 使い方 TimeZoneFormat.Style を取得する場合は以下のように記述して e</androidjavaobject></int>…

【Unity】オブジェクトをタップした箇所の UV 値を取得する

Ray を飛ばしてオブジェクトを取得し、RaycastHit.textureCoord もしくは RaycastHit.textureCoord2 を確認することでタップした位置の UV を取得することができる var _cacheRaycastHit = new RaycastHit(); var ray = _targetCamera.ScreenPointToRay(posi…

【Unity】Transform のパラメータコピー

Unity2020.1 から Transform の Context Menu が更新され 各種パラメータのコピー&ペースト、リセット機能が追加されました 今までは Transform をまるっとコピーすることはできたのですが Position、Rotation、Scale を個別にコピーすることができなかった…

【Unity】MenuItem の表示方法まとめ

各所で右クリックメニューに表示するためのまとめ Hierarchy Window GameObject/ から始まるパスを記述する 但し、priority を指定しない場合表示されないことがある [MenuItem("GameObject/Test") private static void Menu() { } そのため、priority をな…