Unityの2Dキャラクターコントローラー(昔ながらのプラットフォーマーを取り戻そうとしています)


11

この日私は(物理学を使用して)単一性を持つ2Dキャラクターコントローラーを作成しようとしています。私は物理エンジンにかなり慣れていないので、探しているコントロールの感覚を得るのは本当に難しいです。私が見つけた問題の解決策を誰かが提案できれば私は本当に幸せです:

これが私のFixedUpdateです。

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

ここでは、リジッドボディを動かして、重力と線形力を左右に加えます。動いているときに跳ね返ることがなく、摩擦が0、静止した状態で摩擦が1つの物理的マテリアルをセットアップしました。主な問題は、スロープのあるコライダーがあり、速度が上がる(遅い)、スロープを下る(速い)、直線のコライダー(通常)から速度が変化することです。これをどのように修正できますか?ご覧のとおり、x軸には常に同じ速度を適用しています。

プレーヤーのために、力を適用しているリジッドボディである球を足の位置に設定しました。

これで私の人生を楽にするかもしれない他のヒントは大歓迎です:)。

PD帰宅中に、プレイヤーが歩いている表面に平行な一定の力を適用してこれを解決できることに気づきましたが、それが最善の方法であるかどうかはわかりません。


4
古い学校のプラットフォーマーは、ジャンプの力学に手で調整された「漫画の物理学」を使用し、歩行運動に直接速度制御(つまり、物理学をまったく使用していません)を使用しました。キャラクターコントローラーを書き換えることができる場合は、書き直してください。それは、古い学校のゲームが持っていたぱりっとした動きに、ふわふわの物理シミュレーションを突っ込んで作り出すのが難しいためです。
Patrick Hughes

カスタムのものを作成する際の問題は、衝突検出が失われることです。そして、レイキャストを使用せずに再構築するのは簡単ではありません(環境などによっては、それらの束になる可能性があります)。この状況にどのように対処しますか?
Notbad

キネマティックリジッドボディを使用すると、まだカスタムアニメーション化されているものにコライダーを設定できます。ほとんどの状況では、この種のアプリケーションに実際の物理や力などが本当に必要ないことを保証します。より技術的な角度を探している場合は、おそらくHuman IKを調べてください
Runonthespot

1
この状況での物理学の定義。
Ray_Garner 2014年

回答:


7

あなたが古い学校のプラットフォーマーを模倣することを探しているなら、一歩は物理学を完全に捨てることです。あなたは、物理システムと戦い、古い学校のプラットフォーマーの明らかに非現実的な動きを取得することになります。これを実装する1つの方法の良いアイデアを得るために、物理を完全に切り離すこのCharacterControllerの置き換えを見てください。


3

あなたはおそらくメオナが推奨するものでうまくいくでしょう。ただし、Unityの物理演算を使用する場合は、おそらくを使用する必要がありますForceMode.VelocityChange

例:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

また、プロジェクトのPhysics設定でグローバルグラビティを適用する必要があります。速く落下させたいオブジェクトの場合は、Constant Forceコンポーネントを追加します

ForceMode.Impulse似ていますが、剛体の質量の影響を受けます。チューニングが難しくなります。


2

(私がするように)組み込みのCharacter Controllerコンポーネントが気に入らなくても、Unityの2Dゲームプレイチュートリアルのサンプルコードを見てください。

このコードは、キャラクターコントローラーを使用して、移動するプラットフォーム、敵、衝突のあるボックスで完全な2Dゲームプレイを実装します。

しかし、調べたくない場合は、物理の使用を最小限に抑え、その動作を独自のコードでコピーすることをお勧めします。計画している2Dゲームの種類によっては、かなりうまくいく場合があります。たとえば、フォースを適用しRigidbody.velocityてキャラクターを動かす代わりに、を直接操作してTransform.Translate()、オブジェクトTransform.positionをその軸に基づいて動かすことができます。あなたは決定することができるforwardback、オブジェクト自体または多分プラットフォームや床に関連しTransform.up、その傾斜や種類は、その角度を知っていれば、あなたが知っているので、。

また、何らかの速度制御属性(たとえば、キーが押されている時間)を作成する場合は、平行移動中にそれを方向と一緒に適用して、キャラクターがソニックザハリネズミで行ったのと同じように、速度を上げずに傾いて何かを歩くのを防ぐことができますジェネシス/メガドライブ用。

あなたが物理学を使い続けることを選択した場合、私はそれが得意ではないので、私はまったくあなたを助けることができませんが、体が追いつくにはより多くの力が必要なので、「坂を上る」のが遅くなるのは通常の行動であることに注意してください、実生活のように。


結束したときに最初に読んだのはそのチュートリアルでした。問題は、コントロールの感触がかなり悪いことです。これが私が自分の解決策を見つけたかった理由です。一方、Transform.Translate()の使用に取り掛かると、スロープなどを行うのはそれほど簡単ではありません。レイキャストを数回行う必要があります(床の場合は2または3、ヒーローのサイズに応じて移動する方向の場合はさらに多く)。モバイルデバイスの場合、レイキャストは適切ではなく、衝突検出の反復ごとに5..nを実行する場合は少なくなります。おそらく私は間違っているかもしれませんが、私はそうは思いません。
Notbad 2012

1

ビルトインのCharacter Controllerに必要なものstep offsetこのコンポーネントのプロパティを設定することで、プレーヤーが簡単に坂を上り下りできるようになります。


コメントしていないので申し訳ありません。キャラクターコントローラーが1つになっていて、何度か使用していますが、動作が気に入らないのでご注意ください。モーションメカニクスが最も重要なものの1つであるプラットフォームゲームではなく、FPSだけに適しています。
Notbad

キャラクターコントローラーの設定をいじると、うまく機能すると思います。何が足りないと感じましたか?
NoobsArePeople2

最初に気に入らないのは、通常のリジッドボディに比べてレイキャストが遅いことです。それを達成する方法を知っているので、私はもっと軽量なコントローラーを作ることができると思います。別の問題は、プラットフォームエッジでのカプセル/球の奇妙な動作であることです(レイキャストをいくつか行うと解決できます)。自分で転がしたいのはこのためです。
Notbad

0

ここに画像の説明を入力してくださいこれは力がプラットフォームに平行ではなく、結果として上昇が低く、下降が高くなるためだと思います。

座標系に相対力を加えた場合

AddRelativeForce

最高速度を "x"に保ち、それをスカラーと比較します。速度はベクトルであり、vxとvyを合成します。平坦な地形では、vyはゼロですが、勾配では必ずゼロより大きくなります。

速度は体の方向に応じて変化し、その相対的なvxはその全体的なvxに対して変化します

これはあなたが望まない方法であなたのVを修正することができます:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

同じグローバルVxを維持することは、奇妙に思えるかもしれません。(不要な加速)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.