Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

リアクターを回せば中の宝石も摩擦力を受けてコロコロ転がるようにする #24

Open
1 task
JiaChen-Zeng opened this issue Dec 6, 2021 · 14 comments
Assignees
Labels
プログラミング コードに関わる開発 新機能 新機能または追加してほしい機能

Comments

@JiaChen-Zeng
Copy link
Member

JiaChen-Zeng commented Dec 6, 2021

宝石がリアクターの壁面から摩擦力を受けるようにすることが必要

  • あとで仕様書にも加える

関連: #18

@JiaChen-Zeng
Copy link
Member Author

JiaChen-Zeng commented Dec 8, 2021

即時的に関数を実験できる方法がほしく、調べたら MenuItem で実現できるとわかった。これでエディターで手動で関数を呼び出せる。

reactorTransformRotation を直接変更したら、力学的な操作ではないので摩擦力は生まれない。力学的に制御する必要があるので、reactorRigidbody 2D を付ける。他の力の影響を受けないので Body TypeKinematic。すぐに動くので使うべき API は velocity 系。

そしてそのまま Rigidbody 2D を通して reactor を回しても、reactor の部分は回転するものの、壁面の部分は動かない。reactor と子オブジェの壁面と物理上繋がっていないことが原因。Fixed Joint 2D で繋げる必要がある。つながれば壁面の位置は reactor に制御されるため、壁面のオブジェの Rigidbody 2DFreeze は必要なくなる。(#27 で修正)今度回せば摩擦力が見られた。

https://imgur.com/a/MubLQ5B

次にこの回し方を回転ボタンのコードまで実装する。

@JiaChen-Zeng
Copy link
Member Author

JiaChen-Zeng commented Dec 11, 2021

摩擦力を実装していきます

@JiaChen-Zeng
Copy link
Member Author

ReactorRotator でプレイヤーカーソル位置を最終回転位置 RotationDestination として即時に記録し、FixedUpdate で運動学的にその位置へと tween するように回転角度を変える。

しかし回転角度の範囲が限定的なため、2周目まで回すとき回転方向が間違った方向になってしまう。 localEulerAngles.z の角度は [0, 360)。Vector2.SignedAngle の角度は [-180, 180]。負になるとき正になるように 180 を加えてあげると、[0, 360] になる。360 度を超えた途端間違った方向になるのが問題。同じく 360 度を超えて回転する機能を実装したい人がいたみたいで、参考できるかもしれない。

また、0 回転角は回転が始まった場所から計算しておらず、回転開始時一瞬数値の変化が激しい。それと、摩擦力が強すぎたようで、なぜか宝石が直接壁面から通り抜けて漏れてしまう。これはおかしいぞ。

@JiaChen-Zeng
Copy link
Member Author

他の人のコードを研究してみる

@JiaChen-Zeng
Copy link
Member Author

JiaChen-Zeng commented Dec 12, 2021

上のそのリンクで同じような機能についてのスレでは、[0, 360) を超える回転角度を自分で記録して、それを Unity ネイティブの回転角度の代わりにして、その角度を介してネイティブの角度を設定するという方法が提案された。しかしぼくの場合は、操作が物理的であることが必要なので、それだけでは解決されない。

今の回転は (1, 0, 0) を超えたときにしか間違った挙動が起きない。ということはその特別な場合に対して処理を行えば修正できる可能性が大きい。計算過程に注目して分析すると、(1, 0, 0) を超えたとき、もとい回転量が 180 を超えたときに回転方向を修正できる気がした。実装してみると確かにできた気がする。回転が止まったように見えても宝石がガクガクしているので閾値も実装した。

しかしなぜかとにかく宝石が壁面を抜けてしまう。宝石の Collision DetectionContinuous に設定するともはや最初から抜けてしまう。壁面のコライダーの実装が間違っている可能性があると思った。

https://imgur.com/a/z47CKfD

@JiaChen-Zeng
Copy link
Member Author

宝石が壁面を抜けてしまうのは、壁面の Rigidbody 2D は複数のオブジェクトからなっているせいで、宝石がその隙から抜けてしまうという可能性が高い。衝突判定のパラメーターを調整したら直せるか試してみる。宝石の Collision DetectionContinuous にしたら、なぜかFixed Joint 2D があるのに蓋が宝石の重力で落ちてしまう。また、壁面のオブジェクトを Continuous にしたら、蓋が元の位置からはみ出てしまう。これは壁面のオブジェクトのコライダーが重なっていることが原因だと思われる。なのでこのコライダーを修正する必要があると思う。-> #28

引き続き物理の処理を調べる必要があるが、まず #28 の修正でこの問題が解決されるか見てからやる。

@JiaChen-Zeng
Copy link
Member Author

リアクターを回転するとき 、蓋がちょっと取れてしまうことをスクショで発見。これは Discrete でもこうなってしまう。どうやらコライダーが原因でほぼ間違いない。

image

@yigedinglia
Copy link
Contributor

リアクターをチェックしています。確かに回転が速すぎると宝石が飛散しまった。しかしこちらではReactorRotatorを使ってリアクターを回転してみると、蓋がちゃんと位置を保ったようだ。どこか間違ったかな?

@yigedinglia
Copy link
Contributor

Collision Detection を Continuous にするために、まずは衝突しているコライダーを修正してみた。ですが、あまり効果が出ないです。ほかの方法や手掛かりがあれば教えてほしい。

@yigedinglia
Copy link
Contributor

色々実験を行ったが、どうやら物理に関する調整が難しいそうだ。
また、宝石の数が多いため、Collision Detection Continuous にしたら性能が大きく落ちるかもしれない。
ですので、ここでは「コードで隙間から抜けた宝石の位置を制限する」という方法を検討し、実践した。
GemControl.csを使って、リアクターの蓋が開けていない間で、もし宝石がリアクターから一定距離以上に離れたら、
その宝石をリアクターの中に戻るということである。

gem1
一応、効果が出ると考える。後で戻るタイミングや位置、方向などのパラメーターを調整することも可能である。
検証用のシーンを作った:Assets/Prototypes/#27-ReactorFixedJoint2D/RotationTempTest 1.unity
別の方法や考えがあれば、自由に使ってください。

@JiaChen-Zeng
Copy link
Member Author

なるほど、力技ですね。物理シミュレーションが正しくないと変な挙動することがあるので、プレイヤーが予測通りにリアクターを回せない恐れがあります。とはいえ、解決策として当面十分な気もします。

@JiaChen-Zeng
Copy link
Member Author

そのシーンでリアクター回転できないです。入力マネージャーが変えられたのですべてのシーンがおかしくなっちゃってます。早く修正してください。

@yigedinglia
Copy link
Contributor

入力マネージャーを修正した。

@JiaChen-Zeng
Copy link
Member Author

実験してみました。宝石が変な挙動して外に転移されてしまうようです。ダメですね。

https://imgur.com/a/zdrqrIq

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
プログラミング コードに関わる開発 新機能 新機能または追加してほしい機能
Projects
Status: 進行中
Development

No branches or pull requests

2 participants