Home Artists Posts Import Register
Join the new SimpleX Chat Group!

Videos

  • 無題の動画 ‐ Clipchampで作成.mp4

Downloads

Content

この週報はゲーム制作素人がUnityで同人エロゲ🔞を作ろうとするさまの記録です。

初心者の方の励ましに、暇な方の暇つぶしになれば幸いです。


目次


今週の進捗

覚え書き

雑記


今週の進捗

今週もプログラミングでバトルパートを作成しておりました。

見栄え的にはあまり変わりませんが。

で、今回はちょっとUnityのことでがっつり書きますので興味ない方には読み飛ばしてください。

その前に、先週、プログラミングのメモ書きはちゃんと書こうって記事を書きましたね。


せめて考えてから書け。

覚え書き

さて、今回こっちがメインです。

※注意 あくまで仕事でプログラミング経験のない半年さわっただけの素人の解釈です。間違い等あると思いますので、もしありましたらご指摘よろしくお願いします。


・Unityで加算したシーンのオブジェクト座標を取得しようとした話。

現在、HA〇ESのようなローグライトアクションを作ろうと奮闘しているんですが、その時のステージの読み込みを加算シーンで行おうとしてみました。

加算シーンについては下の記事など参照↓





ステージの遷移であればシーンをまたぐオブジェクト(マネージャー系のものとか)をシングルトンにしてする方法などがあるのですが、考えている仕様ではアドベンチャーパートとバトルパートで仕様を分けているため使わないものも多く、シングルトンやstaticはちょっと都合が悪いと思いました。

DontDestroyOnloadが非推奨なのもそうですが、一度生成されるとメモリを確保し続けてしまう上に動的にメモリを開放する方法も調べた限りなさそうだったので違う方法として加算シーンをとることにしました。


ベースとして使うマネージャーやプレイヤーが置かれた共通シーンに、それぞれステージとなるシーンを配置する方法です。



そのステージをクリアしたらクリアしたステージを破棄、そして新しいステージを読み込むといった感じです。

これ自体はそんなに難しくなく、Unity側でメソッドが用意されているため、それを導入すればよかったんですが……


プレイヤーの位置を読み込んだシーンのスタート位置にワープさせられない

イメージとしてはRPGゲームで家の扉を開けたら暗転して、部屋の中に場面が移ってキャラクターが家の玄関内にいる感じですね。

それをやろうとして


シーン読み込み

読み込んだシーンのスタートポイントのオブジェクト座標を取得

その座標をプレイヤー座標に代入


という方法でプレイヤー座標をワープさせようとしたんですが、なぜかこれがうまくいきませんでした。

理由なんですがシーン読み込みが完了の判定が出ていても、オブジェクトがそれより後に生成されていることでオブジェクト座標がnullになってしまっていることでした(どういうことなの…)。

なので今これを読んでいて、シーンロード完了のデリゲート使えばいいんじゃ?と思った方、今回はその方法ではうまくいきませんでした。

オブジェクトがデリゲートのコールバックより後に生成されているという事は、メソッドの実行順序を1つのマネージャーのAwakeでまとめてやらせたとしてもシーン読み込みが入ることで実行順が安定しないため、メソッド実行順がばらばらになるという事態が発生します。


まとめるとシーンロード時に読み込みラグが発生するためメソッドが設定順で実行されないせいでうまく動作しないとなりました。


解決方法としては処理に遅れが発生している箇所を特定して、その処理が完了してから次のメソッドが実行されるようにコルーチンなどで処理を遅らせるという方法を取りました。

まあもちろん、いきなりその答えにはたどり着かなかったので相当悩みましたが。

こんな感じでエラー箇所特定してた。


結果的には、Invokeメソッドを使ってスタート座標のオブジェクトの検索を0.1秒遅らせることでこれに対応することが出来ました


無題の動画 ‐ Clipchampで作成

ちゃんとステージ切り替わりってからプレイヤーが指定位置に飛ぶようになりました。

もし同じようなことしようとしている方がいればぜひ参考までに。

雑記

Twitterのフォロワーが7000人を突破しました。

年内はいかないだろうと思っていたので非常にうれしいです。

これもひとえにみなさんの応援のおかげです。ありがとうございます。


これからもケモおねショタをガンガン皆様にぶつけていくのでよろしくお願いいたします。

Files

Comments

Anonymous

はじめまして、いつも週報でUnityで開発しているのをワクワクしながら見ています。 Unityのスクリプティングについてはちょっとだけ分かるので、こちら老婆心ながらコメントさせていだきます。 こちらなんですが、SceneManager でのロードには LoadSceneAsync を使用されていますでしょうか? LoadScene は同期読込と見せかけて、実は終わった後に色々と裏でシーンのアクティベーションを行なうため、次の処理の時にはまだ完全に終わっていなかったりします。 そのため、基本的には LoadSceneAsync を使うことをおすすめします。 参考になるページ: https://asterisks.netlify.app/2016/02/07/unity-loadsceneasync/ https://docs.unity3d.com/ja/2021.2/ScriptReference/SceneManagement.SceneManager.LoadSceneAsync.html これからも応援しています👏

Anonymous

追記: Invoke はあまりオススメは出来なくて、 Unity 公式もメンテナンス性やパフォーマンスの面で Coroutine を使うことを推奨していたりします。 https://docs.unity3d.com/ja/2019.4/ScriptReference/MonoBehaviour.Invoke.html > "For better performance and maintability, use Coroutines instead." 主な理由としては、 ・メソッドを呼び出すための処理としては無駄に重い ・文字列でメソッド名を入力するので、呼び出し元が追いづらい っていうのがあります。

タケアキ

Inoさん返信ありがとうございます、いつも見て頂けているようで嬉しいです! アドバイスありがとうございます!めちゃくちゃ助かります!基本独学でUnityに関しては周りに聞ける人もいないもので……。 仰る通りで自分はLoadSceneのほうを使ってました。やっぱり裏でアクティベーションしてるんですね…。わかりました、Asyncのほうに変えてみます。 Invokeもおすすめではないんですね。実はなんとなくそんな気はしてて、というのもお手軽過ぎるからプロトタイプで使う感じなのかなあと思いながら使ってました。パフォーンマンス良くないんですね。 分かりました、変更してみます。 ご丁寧に返信くださって本当にありがとうございます、本当に助かりました。 ぜひまたコメントお待ちしてます!