Unity初心者の俺が調べたことをメモするスレ (99レス)
上下前次1-新
61: 2023/09/18(月)22:31 ID:+Uz7sHbq(1) AAS
アウトプットも兼ねて覚えたこと書き殴りたくなる機会がたまにあるんだけど、Unityの制作面中心の雑談スレが見当たらなかったからノリで立てちゃったのよねすまん
代わりに毎日何かしらは作業する・調べるように努力してます
今日気になったこと
・ジェネリックの扱い方
ジェネリックと抽象クラスを利用してUI関係の整理を続けていたが、独自セレクタブルたちが引数の型の異なるRefresh関数(描画情報を更新するために管理クラス側からコールされるpublicな関数)をそれぞれ持っており、これをどうやって統一するか悩む
統一すること自体は抽象クラスにRefresh関数自体をジェネリック<T>で抽象メソッドとして宣言すれば簡単にできるのだが、そうすると同時セレクタブルたちの型が抽象クラスとしても異なってしまうため、管理クラス側から独自セレクタブルたちの配列を扱う時にその型(内部実装)を知る必要性が出てきてしまうように思える
インターフェースでよくないか?とも思ったのだが、インターフェースはUnityの標準機能ではシリアライズ化できないし、キャストしたりGetComponentで具体的な型を指定しないと多分Transform等にもアクセスができないしどうしたものか
抽象クラスの基底に更に抽象クラスを宣言すれば何とかなるのかな…明日以降検証してみる
ちなみにコレクションの復習はまだ出来ていない
というかUIのクラスとレイアウト周りの整理が中心で、検索システムとか内部面は一段落したので暫くコード書くときにコレクションに触れてない
省1
62: 2023/09/19(火)22:19 ID:CqPMq7Md(1) AAS
今日の作業
・独自の派生セレクタブルの処理を抽象化するためにRefresh関数の引数をint型に統一することに決定する。int型以外を引数とするクラスはコード全体を見直す必要が出てきたので数か月前の設計のガバさのツケが回ってきた形。
・MonoBehaviourを継承しないクラスに[Serializable]を付けて、このクラスをフィールドとして保有するMonoBehaviour継承クラスのインスペクターから値を弄れるようにしてみた
基本的な使い方だけどスクリプタブルオブジェクト以外で[Serializable]を利用してこなかったのでちょっと感動
・ノーコード系ゲーム制作アセットの戦闘システムに自作の拡張機能を追加した。攻撃時に攻撃者と被害者をそれぞれ独自戦闘システムインターフェース型でGetComponentしてダメージ計算など色々な処理をスクリプトから行う
有料アセットのテンプレートは便利だけど、個人的にはノーコード系のノードやリスト形式の命令処理は何となく苦手
VisualStudioで素直にC#書いた方が楽だし処理も追いやすい気がしてならない
・「今日の疑問」について調べている時にDictionaryのTryGetValueを使えばキーの存在確認と値のチェックを両方できることを知った
というか前に調べて覚えたつもりだったけど忘れていた
嫌な予感がして自分のコード見てみたらContansKeyとDictionary[]を両方使って二重にDictionaryを走査している箇所が案の定見つかった
省5
63(1): 2023/09/19(火)22:23 ID:iPzaBk+A(1) AAS
ゲットコンポーネントは重くないでしょ
それは公式でも書いてると思うけど
Updateでやっちやあかんって
64(1): 2023/09/20(水)03:37 ID:ncaLFBeu(1) AAS
「Unityでよくある失敗」はコードを書く習慣がある層ならUnity初学者でも回避するよう内容が多いな
GetComponentとFindを周期処理のなかに書くなんぞ最たるもんだな
65: 2023/09/20(水)22:16 ID:6f4RNUvQ(1/3) AAS
>>63-64
必要ならキャッシュしておいた方がいい、との記述はあるものの
外部リンク:learn.microsoft.com
色々な人の検証結果を見る限りはGetComponentを1フレーム内で数万回繰り返しても、処理時間はそれ自体ではぶっちゃけ殆ど差が出ないみたいだね
そう考えると実はUpdate内で毎度呼び出しても現実的なボトルネックにはならないんだろうね
ある意味「GetComponentは重いぞ神話」が独り歩きしている状況かもしれない
自分は基本的にその場限りで利用する場合以外はキャッシュするけども
66: 2023/09/20(水)22:21 ID:6f4RNUvQ(2/3) AAS
代わってGameObject.Find系は本当に看過できないほど重いようだ
ゲームオブジェクト全体を走査する系の処理は重いのは感覚的にもよく分かる
同じくゲームオブジェクト全体にメッセージを送信するSendMassageも滅茶苦茶重いらしくてMicrosoftのDocには
「SendMessage() と BroadcastMessage() は、どんな犠牲を払っても排除されるべきです。これらの関数は、直接関数呼び出しよりも約1000倍遅くなる可能性があります。」(google翻訳)
って書いてあって草
素直にUnityEventsかC#Eventを使うのが安心だな
67(1): 2023/09/20(水)22:22 ID:9mke4B6g(1) AAS
おそらくはまだCPUがショボい頃の事が今でも尾を引いてらのかもね
68: 2023/09/20(水)22:30 ID:6f4RNUvQ(3/3) AAS
>>67
あと可能性があるとしたら、TransformへのアクセスはUnityのバージョンアップで最適化がされたことがあるそうで、GetComponentもそうなのかもしれん(調べてない)
・今日の作業
今日の作業は昨日と変わらず、重い処理関係以外で特に何も調べたりはしなかった
引き続き設計思想の話としては、インスペクターから値・参照を設定・確認できるのは便利である一方で、Unityに慣れるにつれてインスペクターから設定しなくてはならないのはコードとインスペクターの双方を行き来する必要があって面倒だとも感じてきた
UnityにはEventTriggerなど便利なコンポーネントが存在しているが、一部は自分でスクリプトを組めば代替できるものもある
GameObject.Find系が推奨されないもう一つの理由として「制作途中の仕様変更に弱い」という指摘があるが、これにはコードとインスペクターだけではなくヒエラルキーも動作確認の際にチェック対象になってしまう煩雑さを回避したいという願いが暗に含まれていそうだ
69: 2023/09/21(木)22:13 ID:+9E6IOzm(1) AAS
今日は自作のインベントリシステムに並び替え機能の実装を始めた
List.Sortで自作クラスをソートするにはIComparableインターフェイスを継承してCompareTo関数を実装するか、又はラムダ式で直接ソート順を指定することでも可能となる
ラムダ式は匿名関数を作成するもので、内部的には最初に実行される時のみnewされて関数が生成されてそれ以降はコンパイラが自動的にそれを使い回してくれるそうなのでアロケーション面でも優しい
Unityでお世話になる時は大体ソート関係な気がする
70(1): 2023/09/22(金)02:12 ID:2ujM814X(1/2) AAS
Linp使えるからSQL的なSelect,Whereなんかも使ってもいいね
71: 2023/09/22(金)02:14 ID:2ujM814X(2/2) AAS
すまんLinqだスマホだから打ち間違えた
そしてpもqもパッと見見分けつかんからそのまま送信してしまった
72(1): 2023/09/22(金)21:58 ID:TT/FNhBR(1) AAS
>>70
LINQは便利そうな機能が一通り揃ってるのね
ただ前に使ってみた時に(どの関数かは忘れた)素直にForやForeachでやるのと比べて凄い量のアロケーションが出てたから使うのやめちゃってたわ
インベントリ内アイテムの並び替えみたいな、そう頻繁に行われない処理にはLINQの使用を再検討してみようかな
直接並び替え用の式を書くと後で見た時に大抵「何だっけこれ…」ってなるから…(まずコード上の注釈を再読む所から始まる)
今日も並び替え機能の実装を進めた
そういえばクラス間の情報のやり取りで静的イベント(public static event Action<>〜)はよく使っているけど、Funcはまだどこにも利用してないと思った
がChatGPTによるとFuncはリスナーが複数いる場合に戻り値にどのリスナーからの値を使用すべきが不明瞭になるから使っちゃいけないらしい
よく意味が分からなかったので明日以降検証したい そもそもこの疑問が浮かんだのが作業が終了してからなのでVisualStudio上でコード自体が適切にコンパイルできるのかすら試してない
73(1): 2023/09/22(金)22:10 ID:1GHnfQ7l(1) AAS
適切にコンパイルされたか否かって何かToolとかあるんです?
74(1): 2023/09/23(土)13:04 ID:pGEksIgm(1) AAS
>>72
たしかにLinqは便利な分最適化には程遠いかも
75: 2023/09/23(土)17:27 ID:bmDBxj8t(1/3) AAS
>>73
いや分からない(知らない)
コンパイルすら通らないのかコンパイルは通るけど使い方間違えると実行時エラーでるのかが分からないからそう書いただけ
>>74
便利だけどゲームだと使い道が難しそうな印象があるなあ
今日の作業で久しぶりにLINQ使ってみたけど、FindAllしたら新しいList<T>インスタンスが戻り値として生成されるみたいで結構な量のアロケーションが発生しちゃった
Forで要素0からループで走査して条件一致する度にグローバルな使い回し用リストにAddするとアロケーション無しになる
ただインベントリのアイテム内を並び替えるだけの処理で戦闘中とかフレームレートが必要な場面で呼び出されることは想定してないから、まあ実際にプレイに影響は出ないとは思うけどね
76: 2023/09/23(土)17:50 ID:bmDBxj8t(2/3) AAS
そういえばFuncでリスナー複数いるとどうなるの?問題についてちょっと検証してみたそういえばFuncでリスナー複数いるとどうなるの?問題についてちょっと検証してみた
using System;
using UnityEngine;
public class TestClass : MonoBehaviour
{
// 静的アクション
public static event Func<int,int> testFuncEvents;
// シリアライズフィールド
[Header("Funcテスト")]
public bool startFuncTest;
省10
77: 2023/09/23(土)17:51 ID:bmDBxj8t(3/3) AAS
改行と文字数の限界でコード貼るのは無理か
結論としては
? 変数に代入される戻り値は一番最後に登録されたリスナーのものになる
? 最後のリスナーのみがプロパティをコールする。リスナーは3人いるのにプロパティは1回しかコールされなかった(リスナーは3人ともデバックログが出たが、プロパティは1回しか出なかった)
? nullはnullじゃない文字列と連結しようとすると空白になるが、単体又はnullと連結しようとすると文字列はNullになる
まあリスナーの管理が面倒だからたしかにChatGPTの言う通りFuncはイベントで扱うべきじゃないのかも?
78: 2023/09/24(日)22:38 ID:S8roHB1T(1) AAS
今日の作業はクラスの設計を考えた
「カプセル化」をすることでクラスを他の処理にも再利用できるので、静的イベントやインターフェースを駆使して様々な「選択」が必要なUI画面で利用できる独自セレクタブルを作りたい
79: 2023/09/25(月)21:40 ID:Lma5XPF1(1) AAS
今日はグラフィック関係をやっていてコードにあまり触れてないので調べ物はナシ!
enumのSwitch式だかSwitch文だかをもう少し書きやすくする方法ないかなとは思ったり
80: 2023/09/26(火)21:52 ID:2Scqx0S0(1) AAS
制作が軌道に乗ってくるとメモすることがなくなるんだよな
既に調べた知識で作り続けるだけだから
だいぶ先になるけど有料アセットのうちFinalIKとEasySaveは詳しく使い方を覚えたいし覚えたら書くかねえ
特にFinalIKはUnity標準のメカニムとどのくらい共用できるのか知りたい
上下前次1-新書関写板覧索設栞歴
あと 19 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.016s