Unity初心者の俺が調べたことをメモするスレ (99レス)
上下前次1-新
57(1): 2023/09/18(月)12:08 ID:RKiVL9Tq(1) AAS
l_i_t_e(邪魔という方は左記をNGお願いします)
更にご家族に教えて加えて¥4000×人数をGETできます!
画像リンク[jpg]:i.imgur.com
58: 2023/09/18(月)13:39 ID:YQ8UtnvT(1) AAS
>>57
もう現金に換えてアンインストした
59: 2023/09/18(月)16:11 ID:ylIv/p+P(1) AAS
普通なら削除依頼出しとけよって定型文貼られるようなスレだけど
技術者多い板の性質と真面目な内容が組み合わさって技術メモブログのように存在を許されている
60: 2023/09/18(月)16:34 ID:GrWZQeuh(1) AAS
絵描き板とかである個スレみたいなもんでしょ
過疎板にはよくある
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
上下前次1-新書関写板覧索設栞歴
あと 23 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.020s