【Unity2d】当たる位置によって吹っ飛ばすベクトルを変える

Unity2D

Unity2D ARPG

こんにちは。なおキーヌです。

ブログ毎日更新は348日目になります。

衝突判定を取ったらそれをトリガーとしてゴブリンに加速度を与え動かすことが出来ました。

今回はハンマーの当たった位置によって吹っ飛ばす方向(ベクトル)を変更してみましょう。

アニメーションによって加速度を変化させる方法

アニメーションによって数値を変化させるには、まずオブジェクト専用の値を持たせなければいけません。

これをステート管理スクリプトに埋め込んでしまうとオブジェクトが増えるたびに
コードが増えていってしまうのでこういうものはUnityの恩恵をありがたく受けましょう。

数値だけを保持するスクリプトを作ります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class _ObjectStateWeapon : MonoBehaviour
{
  public Vector2 force;

    void Start()
    {
        force = Vector2.zero;
    }
}

スクリプトの変数定義のところで

[SerializeField]

を付けるとUnityエディタで値を操作できるようになります。

しかし今回は付けておらずアクセサをpublicにしました。

これでも[SerializeField]と同じようにUnityエディタで弄られます。

前者と後者の違いは簡単に言うと外部スクリプトからアクセスして書き替えられるかどうかですね。

前者の場合privateで宣言できるのでアクセスするにはプロパティとかが必要になります。

もちろんpublicにもprotectedでもできます。

でもpubcliにしちゃうとシリアライズフィールドを付ける意味がないですね(笑)

最終的には内部で数値を操作するのでprivateにてプロパティを設ける予定ですが
一旦デバッグ用にエディタ側で数値を変えられるようにしておきました。

このスクリプトをハンマーに持たせて、アニメーションのところで
タイムラインにスクリプト値を変化させるようにすればアニメーションごとに力を変化させることができます。

この変数を使ってAddForceの値を設定します。

しかし移動させるのはモンスター側のスクリプトなので、
この値を渡してあげなければいけません。

なのでモンスター側のスクリプトで衝突したオブジェクトの情報を取得して
Forceを参照してAddForceを実行します。

早速やってみましょう。

    private void OnTriggerEnter2D(Collider2D other) {
        _ObjectStateWeapon weapon = other.GetComponent<_ObjectStateWeapon>();
        rb.AddForce(weapon.force);
    }

衝突してきたコライダは取得できるのでそのままスクリプトを参照できますね。

後はそのスクリプトが持っているforceを参照すればOKです。

一旦forceの値をXとYともに500にして衝突判定させてみて、
右上に動いてくれたら成功です。

アニメーション側で数値を決める

後はハンマーのアニメーション側で数値を決めるだけですね。

1000fぐらいで良い感じ飛んでくれたので基準値は一旦1000fでよさそうです。

ハンマーのフレームは6フレームあります。

一旦下向きしかまだ実装してないのでそれぞれ

  • 1枚目:X=-1000f, Y=100f(左ちょい上ふっとび)
  • 2枚目:X=-1000f, Y=-500f(左寄り下吹っ飛び)
  • 3枚目:X=-200f, Y=-1000f(下寄り左吹っ飛び)
  • 4枚目:X=0f, Y=-1000f(下吹っ飛び)
  • 5枚目:X=500f, Y=-1000f(下寄り右吹っ飛び)
  • 6枚目:X=1000f, Y=100f(右ちょい上吹っ飛び)

極端ですけどこんな感じでしょうか。

何度か攻撃してみると3枚目のハンマーが当たりやすかったですね。

そしてよく見ると最初の衝突判定が少しずれていました。

これは後程直そうと思います。

コリジョンのずらし位置もスクリプトでかっちりと固定してあげたほうがいいかもしれませんね。

良い感じに吹っ飛んでくれました。

最後にハンマーのforce変数をpublicだと何かとまずいのでprivateにして、
プロパティでget出来るようにしておきましょう。

とおもったのですが、どうやらPrivateやProtectedにすると
Animationから取得できなくなってしまうようです。

この辺はあんまりよろしくないですね……
しかし考えていたら進まないので課題として残して次に進みましょう。

予定ならもうステージギミックを作ってるところなんですがちょっと怠け過ぎましたね……

次回はモンスターをドット移動でプレイヤーに近づける準備をしましょう。

それでは。