【ゲームエンジン】Unity初心者質問スレBuild2
レス数が950を超えています。1000を超えると書き込みができなくなります。
InputSystem 良いね。でも、Unityの初心者向けサイトはまだ InputManager 使うやり方で
説明されてるので、これから Unity 始める人は InputSystem が使いやすいと思う。
さあ、ひとまず開発環境でのゲームパッド問題は解決した。教えてくれた人ありがとう。
次はフレームレートの問題だな。開発機の Windows 10 では普通に 60fpsで開発してたんだけど、
Android 9 の実機では 60fps では厳しくて、30fps にしようと思ったが、さらに古い Android 5 で
動かしたら、20fps 程度じゃないと安定しなかった。
作ってるのは、64マリオみたいな3Dアクションだけど、判定に Ray 投げまくりなので、
fpsが異なる設定の Android の実機で動かすとバグ出まくりだよ… あと ゲームパッドの振動だ。
XInput と DirectInput のコンパチでゲームパッドを振動させる方法があるのかな? というか、InputSystem なら
Gamepad.current.SetMotorSpeeds(1f, 1f);
とかで、開発環境 Windows 10 で XInputモードの 8Bitdo N30 Pro 2 は振動した。
InputSystem やるじゃん! 公式にゲームパッドの振動に対応したんだと思ったが、
デプロイ先 Android 9 で DirectInputモードの 8Bitdo N30 Pro 2 は振動しなかった…
Windows 版は振動対応だけど、Android 版は振動未対応って、ぐぬぬ いや、8Bitdo N30 Pro 2 自体が、DirectInputモードでは振動未対応って可能性もあるね。
誰か、InputSystem の SetMotorSpeeds で、DirectInputモードのゲームパッドを振動させることに
成功したら、教えてくだせえ。
振動ありとなしでは、ゲームの面白さが段違いだよ… というか公式に振動の解説あったわ。
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Gamepad.html
> PS4, Xbox, and Switch controllers, when connected to their respective consoles.
> Only supported if you install console-specific input packages in your Project.
> PS4 controllers, when connected to Mac or Windows/UWP computers.
> Xbox controllers on Windows.
InputSystem の Rumble が Android に対応していない… >>851
そういうときのfixed updateだよ!
そしてそこでinput systemが活きてくる! >> 856
自分は Unity は初学者だけど、Unity の作法通り、FixedUpdate() で Rigidbody に対して処理書いてオブジェクトの動作させてる。
それでも、fps が変化すると、壁を上りきる時とかハシゴを降りる時とか、Ray 処理の微妙な判定で細かい動作バグが出てる現状…
※オブジェクトの動作は全て自前実装。
ゲームパッドのキー入力は Update() で取ってるけどね。 >>857
通常のupdate(描画)のフレームレートはいくら下げてもいいけど、fixed updateのフレームをさげちゃダメだよ InputSystemとMRTKのイベント周りは同じ思想になってる?InputSystemよく知らんのでわからんけど >>858
アドバイスありがとう、FPSは自前で計測するコード書いて表示させてたけど、
FixedUpdate のFPSを確認する発想はなかった。
ゲームのFPSは、設定で vSync を無効にして、コードで Application.targetFrameRate = 20;
とか設定して 20fps にしてた。
で、FixedUpdate のFPSも計測するコード書いて確認したら、50fpsだった。
あれ? FixedUpdate って 50fps なの?って思って調べたら、設定の固定タイムステップが
0.02 になってたんで、0.0167 にしたら、FixedUpdate のFPSも 60fps になってなるほどと思った。
あと、1GB RAM の非力な Android 5 タブレットでも、固定タイムステップ:0.02 で
FixedUpdate 50fps 出てたので、演算は出来てんだと思い、表示が間に合わないのかと推測した。
>>859
ごめん、MRTKのイベントという言葉自体が分からないので調べるわ。 2018くらいからデフォルトが0.0167になったはず fpsを変えると細かいバグが出る件は、Ray 判定の処理を Update から呼んじゃってるからだと気づいた。
物理処理が一定なのに、Ray 判定を 60fps で呼んだり 20fps で呼んだりしたらそりゃ豪快にバグるわな。
プレイヤーがブロックにめり込んだり、地形に埋まったりする。
でもここの処理を弄るのは、コードの根幹部分からの大改修でへこむは…
あとMRTKは複雑で今の自分には必要ないかな。 Unity でのゲーム開発において、Update でやるべきこと・やってはいけないこと、
FixedUpdate でやるべきこと・やってはいけないことを、本質から丁寧に解説してる参考サイトは
本当に少なくて、なおかつ自分のような初心者がテキトーにコードかいても、
ゲームとしてそれなりに動くから後で困る… ざっとネットをあさっても、やはり Raycast は Update に書いて着地判定するとかあるけど、
同じスクリプトで 60fps、20fps で Update で着地判定したらバグるよね? 物理演算は 50fps 固定と想定して。
上からモノ(オブジェクト)が落下してきてるけど、着地(衝突)判定が 20fps なら、着地判定が間に合わなくて、
地面をすり抜けるバグがある。
※アセットとキャラコントローラは使用しない方針
この辺が納得出来ないのは、まだ自分の理解が足りていないからだろうな。 >>864
アセットを買いましょう
時間の無駄です アセットおじさんをこのスレからDestroyするアセットが欲しい DestroyImmediate(キチガイ.アセットおじさん); >>864
たったあれだけの俺のレスでそこまで気づけたのはすごいね
物理挙動がシビアなものを扱うときはfixed updateで、そうじゃなければupdateでいいよ 明けましておめでとうございます!
今年も頑張ってアセット購入しましょう! Invokeで遅延かけてAudioSourse.PlayOnShot呼びたくて色々調べてたんだけどやっぱりどうしようもない?
コルーチン定義すると散らかって悔しいというだけの理由ではあるんだけど >>871
汎用コルーチン作ってAction使って呼び出せば散らからない >>869
アドバイスありがとう。
おかげでスクリプト改善して、致命的な個所は大体追い込めた。
今、3Dアクションゲームの水の面を作ってるんだけど、水中を判定する上手い方法はないかな?
複雑にしたくないので、水面オブジェクトはスタンダードアセットの "Water" で進めてる。
水面の判定はコライダーで出来たけど、水中の判定で良い方法はないかと悩んでた。
ざっくり思いついたのは、プレイヤーが上に Ray を投げて水面があり、かつ水面より自分が低ければ水中みたいな。 >>872
一応それがあるのかありがとう
結局コルーチンになりました >>874
水面って水平じゃないの?
水平なら単純にtransform.position.yでやる >>876
なるほど、とてもシンプルな解決策だと思う。
ありがとう自分では思いつかなかった。
Raycast で想定通り出来なくて困ってたとこだった。
本当にサンキュー おかげで良い感じに水中の挙動実装中だけど、
泳ぐアニメーションを適用したら、泳いでる時、プレイヤーがブロックや壁にめり込むようになった。
確認すると、アニメで3Dモデルは前傾してるのに、カプセルコライダーは立ってる時のままの位置だった。
これは、アニメで3Dモデルが傾いたら、カプセルコライダーも自前で傾ける感じ?
そもそもカプセルコライダーで衝突判定してるのが間違い?
でも、もういろいろ調整して面倒くさいので出来れば、プレイヤーモデルのコライダーの種類は変えたくないなあ。 >>878
腰ノードにカプセルコライダー付ければいいんでない? >>879
なるほど、3Dモデルは腰では分けてなかったので、体ノードにカプセルコライダーつけたら、水中の前傾でのめり込みが解消した。
でも、もともとの歩く時も傾斜しないカプセルコライダー基準で、オブジェクトを掴む判定や、上る・下りる判定をしてたので、
地上と水中でカプセルコライダーを切り替えることが必要かな。
ありがとう。自分では気づけない発想で本当に勉強になって助かる。 前々からちょっと気になってたので質問させてください。
オブジェクトAのクラスAにpublic GameObject objB
としてオブジェクトBをインスペクタ上からクラスAにアタッチした場合って
メモリの使用はBは参照してるって認識でいいんでしょうか?
例えばオブジェクトBのデータ量が100MBあったとして、
Aにアタッチしたらゲーム内で200MB使用してることにならないのかって意味です。 それアタッチじゃなくて参照じゃね?
ゲーム立ち上げてメモリーマネージャーとかで見ればよくね? 質問させて下さい。
update内で
if(enemy.hp == 0)
を条件にエネミーオブジェクトをデストロイして新しいエネミープレファブを生成する処理を書いたとすると、新しいエネミーが出現するまでの間コンソールにenemyがありません的な警告が出続けてしまいます。
この警告は無視しても良いのでしょうか?
それともhp == 0という条件を辞めて他の関数でhpが0になったらenemyAlive = falseなどのフラグをたてて管理すれば良いのでしょうか?
もっと良い方法もあるのでしょうか?
初歩的すぎる質問だと思いますが先輩方の知恵をお貸し頂きたいです。
よろしくお願いいたします。 珍しくまともに質問スレしてるな
3年ぶりくらいか? 書き忘れてしまいました。
作っているのはRPGの様なバトル画面でプレイヤーとエネミーの攻撃力を交互にHPから引くという動作をさせている物です。
今は1vs1で雛形作っていますが、完成後には敵を複数出現させたいと思っています。 >>883
無視しても影響は無いと思うけど、警告は意図しない使われ方だから出てるわけで、出来ればステータス管理用のクラスを別で作ってそれを持たせておいた方がいいね >>883
ありません的なじゃなくて正確な警告文書こうや >>886
回答ありがとうございます!
同じスクリプト内でいろいろ処理してしまってるので管理クラスを別にする方法もためしてみます!
>>887
本当にその通りだと思います、申し訳ありません、、
色々試行錯誤して警告が出なくなってから、もっと良い方法があったのかな?と書き込みしてしまったので警告内容がわかりませんでした。
(nullの文字があった事だけ覚えていたので曖昧な表現になってしまいました)
今後は気をつけます!
ありがとうございました! >>883
if(enemy != null)
とかで、エネミーが存在するときだけ処理すればいい if文は重いので可能な限り減らしましょう
最初のenemyが出てから呼ぶようにしましょう まぁぃまのパソコンやスマホでifの分岐なんかどうでもいい処理
gameobject.find ですら問題ない
結論、気にするな もっと良い処理は所謂オブジェクト思考
enemyさんのhpを減らしてる処理がどこかに在るわけさ、それはenemyさん自信が持ってる可能性あるので、そこで0になったら次のenemyさんを生成してあげるように管理者へ働きかければいいのさ
攻撃あたる→ダメージ分だけhp減らす
ってやってるはずだお 質問チンコ(^^
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
と言われるのでふが(^^
御覧の通り特にマイナスは使ってないんでふよ(^^
Debug.Log("1枚目のシートの1番目 name=" + mobList.sheets[1].list[10].威力);
原因分かりまんこ?(^^
ちなみにテラシュールさんのスクリプト使ってまふ(^^ >>896
単純に配列のサイズより添字の方が大きいだけ 3Dアクションゲームの水の面を実装中。
開発機 Windows 10 にてPostProcessで水中のブラー表現とかして、良い感じと思ってたが、
デプロイ先 Android 10 でFPSが激落ち。水中で0.7fpsっておい。
また、水面を実装したとたんに、処理落ちで平均20fpsとかになってしまった。
水面はスタンダードアセットの "Water" だけど、そんなに処理食うものなの?
あと、モバイルではPostProcessは無理っぽい感じかな?
なんか昔の記事ではImageEffectとかあったらしいけど今のUnityにはない?
水面・水中実装は必須なので、なんとか処理負荷軽減しなくては。 >>898
いいアセットがありますから、ぜひ買ってください "Water" は設定を見直したら処理負荷が少なくなったので、おそらく問題ない。
問題は、PostProcess で、コレを切ったら、モバイルでFPSが激上がる。
動作リファレンスは Android 9 (Android One S3) ※上では書き間違えた
この機種は、ゲームするには低スペックなので、コレでサクサク動けば問題ないかなと。
もっと言えば、最近の RAM 3GB 程度の Android TV で30fpsで動くことが目標。
PostProcess モバイルでは全然使えんね。ただ画面に水中にいるように、
青緑のフィルターかけたいだけなのに… なら画面全面にimage を半透明で覆えばよくね? >>901, 902
アドバイスありがとう。
今回はひとまず Canvas に "画像" を追加して、青緑の半透明に設定し、
水中判定の時にON, OFFすることによって目的の機能が実装出来た。
が、FPSは、水中で27fpsとか微妙な数値になってしまうので、
もう少し水中動作時の処理負荷の原因を追う必要があるみたい。
でもサンキュー。 >>903
リアルタイムならon offで重さが変わるから、色味に影響のない透明度0.01ぐらいで置いて、処理時間をなるべく変化させないということもあるぎゃ。 RAM3GBとかどんなハイスペスマホだよww
そんなの持ってるやつ数パーセントもいないぞ Unityとは関係ないけどバトルゲームでのアニメーションの時間感覚がわからん
ボタン押す→予備動作→アクション→ヒット→戻るって遷移で
ボタン押してヒットまでの時間を0.33秒にしたら
見せた友人に早すぎてわからんと言われたし…
棒切れで人をポカリと殴るモーションなんだが >>904
ありがとう。今、Canvas に ”画像” 貼る解決法は保留にして、カメラに自作スクリプト付けようと試してた。
void OnRenderImage(RenderTexture src, RenderTexture dest) {
Graphics.Blit(src, dest, material);
}
とかで、試しにマテリアルに "water" のマテリアル渡したら効果が付いた。
よし、初めてシェーダー書くか! と思ったら記述言語 C# じゃない…
青緑半透明をオーバーレイするだけのシェーダーなんだけどね。調べるか。 >>905
RAM 3GBは個人的なアプリ動作の想定値だったけどこれから増えてくると思う。
数年前の RAM 1GB〜2GB時代には、モバイルでUnity制作の3Dゲームは厳しいだろうなと思ってたけど、
RAM 3GB〜4GBの時代になりつつある今、Unityで3Dゲーム開発だ!と思ってここに来たとこ。 >>909
日本人の後進性を舐めすぎ
3GBスマホなんか絶対普及しないから諦めろww 浦島太郎かよ
いまどきキャリアもMVNOも3GB以上しか売ってねーよ ID:UKiA3e/sのビルドターゲットってバージョン何? SIMフリーの低スペ機種とか年寄り専用スマホが3GB
3大キャリアが主力で売ってるのは4GBと6GBだからな 自己レスだけど、青緑透明シェーダー作ったが、普通のサーフェイスシェーダーだと
カメラに付けても半透明の視界が得られず、フラグメントシェーダで青緑透明シェーダーを作成した。
Windows 10 開発機でそこそこ動いて、Android 9 にビルド実行したら、激遅というかまともに動かなかった…
まあ、シェーダーの基本の "き" くらいは体験できたので面白かったけど。
自作シェーダーでも無理となるとキャンバス前面に "画像" 貼り付け? 明らかに処理遅くなるんだよな。 さぁ900越えて加速したね
完走まであと少し愚痴も雑談も歓迎!
頑張っていきましょう! >>917
ぽストプロセスでやるべき?詳しく知らんけど >>919
ありがとう。PostProcess は試したんだけど、モバイルでは激重で使えなかったんだ。
>>920
クライアントに30fpsは死守せよと命じられたからね。まあクライアントも開発者も自分だけど…
プロファイラみたら、結構スクリプトで処理食ってるんで UniRX で Update() と FixedUpdate() を
置き換えた。Start() に UpdateAsObservable とかで全部書くやつ。
結果、あんまり変わんない、自分の使い方が悪いのか… インスペクターにセットしないで他のクラスを使うスクリプトの記述方法ってあるのでしょうか? >>926
なるほど!早速試してみます!
継承というのは: MonoBehaviorの部分を好きなクラス名に変えれば良いんですよね?
継承するクラスは一つしか選べないのでしょうか? C# 継承 複数で検索したら一応解決しました!
調べればすぐ分かることを聞いてしまってごめんなさい。
ありがとうございました! 聞く方もわかっていなければ、答える方も分かっていない典型だな 質問失礼します
3人などの複数人で開発する場合に自分のみが有料アセットを所有しておりそれを使いたい場合のプロジェクトの管理方法はどうするのが一般的ですか? >>924
Updateの呼び出しじゃなくて中身が重たいんだと思われ
deep profile すれば具体的なメソッド名まで追えるから、まずはそれで負荷の高い処理を特定しましょう >>931
アドバイスありがとう。
詳細プロファイルみたら、どうやら処理の中身で gameObject.name.Contains("Hoge") とか
多用してるとこが処理コストが高いっぽい。
地道にプロファイラ見て、重そうな箇所をつぶしていくしかなさそうだね。
自分の使い方がこなれてないので、UniRX 自体は良さそうだと思った。 >>929
確かにわかっていないので今まで通りpublicかシリアライズでインスペクターに表示して他のクラスを貼り付けたオブジェクトを入れています。
なにかこの作業を省略出来る方法はあるのでしょうか?
継承について聞けて調べた事は今後活かせる事もありそうなので感謝しています! Updateの中でFindはさすがにStartでやってキャッシュしないとそりゃそうなるな…… Unityを触り始めた時、プレイヤーやエネミーなど、画面に表示するキャラクターは、GameObjectを継承した子クラスとして作るのかと思っていたのですが、そうではないですよね。
この様なプログラムに初めて触れるので今でも違和感があるのですが、何故この様な仕様になっているのでしょうか?
また、この様な実装方法は、デザインパターンで言うと、何パターンになるのでしょうか?
ご存知の方、いらっしゃいましたら、教えて頂けると嬉しいです。
お願い致します。 >>933
ゲットコンポーネントすればわざわざインスペクタで指定しなくていい
基本他のクラスファイルはそのまま使える
またネームスペース指定してるならusingで指定すれば使えるよ
>>935
ユニティはすべてコンポーネントからの継承
強いて言うならコンポーネントデザインだよ
それが分かった所でプログラム出来るようにはならないから無駄な質問はやめようね 継承が嫌ならインターフェース定義すればいいじゃない >>935
MonoBehaviour を継承して、Update() とか FixedUpdate() とか様々なフックハンドラを実装してく作法だよ。
しいて言えば、GoFのObserver パターンに近いんじゃない。Unity 内部の実装は違うらしけど。
GameObject を継承するんじゃなくて、GameObject に上記の MonoBehaviour 継承クラスを紐づけて動作をさせる。
この仕様だと、GameObject が "複数"の MonoBehaviour 継承クラスの動作を行うことが出来る。
C# は多重継承出来ないでしょ、Unity よく考えられてるシステムだよね。 自分も最初 Unity のスクリプトに違和感というか、なんだろうこれは? と思った。
Unity 以外の他言語経験者というか、自分も職業プログラマの端くれなんで、
Player クラスとか、Enemy クラスを定義するんだよな。とか勝手に思って最初そのように書こうとしてた。
でも、Unity には GameObject という規定クラスがあり、それらに対する作用を MonoBehaviour 継承クラスに
記述して GameObject にアタッチ(紐づけ)するという仕組みを理解してからは、腑に落ちたというか納得出来た。 書いてて思ったけど、GameObject に拡張メソッド書けば良くね? と思って調べたら、やっぱりそうしてる人いた。
処理コストとか気になるけど、静的 Utuil クラスとか書くより、 拡張メソッド書いたらスマートに記述出来る箇所が山ほどある。
>>935 サンキュー めちゃめちゃ良い気づきを頂いたわ。 なるほど。GameObject に MonoBehaviour 継承クラス"型" の変数を自由に設定出来ると。
その "型" を "Component" と言いますと。そして、GameObject.GetComponent<型> で自由に変数を取得出来ますと。
最初からそう教えてくれればいいのに。 Unity 良いね。ほんと好きになったわ。
元々 C# が超強力な言語なんで、とにかくプログラミングが楽しい。 >>942
まあ、みんな一度はそう思うんだけど、ゲームを作ってる以上、次はC#はもちろんUnityならではボトルネックの最適化でつまずくんだよなー そこでJobSystem,Burst,ECSですよ JOBSYSREMとかビジネス啓蒙系のサイトっぽい名前 boolの配列で中身の全てがtrueなら○○するという処理はどうやって書けばスマートですか?
今は配列の要素数が3しかないのでifを使った分岐で力技で動かせて居ますが数が増えたときの事を想像すると頭が痛いです。 if文を3つ書いてるということならforeach使おう 配列数が固定ならFlags付けたenumでビットフラグ使う
動的に増減するなら設計がおかしいんだがLINQのAllを使えば簡単に書ける for(int count = 0; count <= 2; count++)
{
if(配列[count]== true)
{
変数++;
}
}
if(変数 == 3)
{
処理
}
にしてみたのですが微妙ですか?
foreachとlinqはまだ使い方がわからないのですが調べてみます。 レス数が950を超えています。1000を超えると書き込みができなくなります。