キラキラだ!


ちょっとモデリングとかしたいと思いBlenderをいじってました。
小一時間ほどやっていい感じの宝石ができたのでUnityで表示してました。
次はぶっ壊してみたいと思います。

モデリングは

シェーダーは

を参考に作りました。
本当にありがとうございました。

Photon Fusion がムズい


TGS2025 の学内ブース展示に向けて、オンライン対応の 3D アクションゲームを作っています。
(正直かなり製作がギリギリで怖いです…)

今日はプレイヤー移動まわりで、左右切り替え時にキャラがガクつく問題に取り組んでいました。

この問題自体は以前から発生していたのですが、
「通信が重いせいなんじゃないか?」などと勘ぐりつつ色々調査して、ようやく原因を特定できました。
プレイヤーのコンポーネントを一つずつオフにしたり、移動処理の関数を一行ずつコメントアウトしたり…かなり大変でした。
しかも自分の書いたコードじゃない部分もあったので、処理内容を理解しながら進めるのも一苦労でしたね。

起きていたこと


クライアント側で左右反転するとキャラがガクつき、移動が横滑りしているように見える。

原因


  • クライアントサイド予測と噛み合わない移動処理
  • 回転を Transform.rotation に直接書き込んでいた

クライアントサイド予測と噛み合わない移動処理

プレイヤーの移動は、以下のコードで「なるべく滑らかに動くこと」を狙って実装されていました。

Vector3 targetVelocity = _moveVelocity + moveDir3 * acceleration;

既存の移動ベクトルに「入力方向 × 加速度」を加算することで、反対方向に入力したときにパッと切り替わらず、慣性のある動きになるようにしていました。

この処理は FixedNetworkUpdate 内で実行しており、ホストクライアントでは問題なく動作していました。
しかしクライアント側では、これが 横滑りの原因 となっていました。

仕組みを完全に断定はできませんが、おそらく更新が通信の同期タイミングに依存していて、滑らかに補間されず横に流れる挙動になっていたのだと思います。

ここは今後、入力に応じてキビキビ切り替わる処理に修正しようと考えています。
オンライン対戦アクションでは、むしろ即応性のある動きのほうが操作感に合っていますし。

回転を Transform.rotation に直接書いていた

移動は Rigidbody ベースで行っているのに、回転だけは Transform.rotation を直接操作し、RotateTowards を使っていました。
これは一貫性がなく物理挙動とも噛み合わないため、今後は Rigidbody.MoveRotation に置き換える予定です。

正直、キャラ移動まわりをこれまであまり触ってこなかったので、
「MoveRotation なんて便利な関数があるんだ」と今回初めて知った感じです。

終わりに


記事内でも触れたのですが今年のTGSのバンタンゲームアカデミーのブースに出展する予定です(間に合えば…)。
自分たち以外のチームのゲームもクオリティ高いと聞きますし、何より頑張って作ったゲームを楽しんでもらえるのはとても良い経験になるので是非遊びに来てください!