Unity

Transformで敵を動かすと壁をすり抜ける



if (this.a == 1) { this.transform.Translate(Espd, 0, Espd); }
if (this.a == 2) { this.transform.Translate(-Espd, 0, -Espd); }
if (this.a == 3) { this.transform.Translate(-Espd, 0, Espd); }
if (this.a == 4) { this.transform.Translate(Espd, 0, -Espd); }

↑こんな風にtransformで敵を動かしたら壁をすり抜ける現象がたまに起こってしまった。上下左右に移動させる敵はすり抜けないけど斜めに移動させたらすり抜けた。

敵の移動にtransformは使わないほうがいいよとは聞いていたけどやっぱりいろいろ挙動がおかしくなるのね^^;

そこでRigidbodyを付けてaddforceで動かすことにする。

int a = 1;		//移動方向を決めるのに使う
float delta = 0;	//数を数えるのに使う
float span = 3.0f;	//方向転換させるタイマー
float maxSpd = 5;       //最高速度
float nowSpd = 0;       //今のスピード。最高速度以下なら加速させる
float powX = 25;        //X方向に加えるスピード
float powZ = 25;        //Z方向に加えるスピード


void FixedUpdate() {

        this.delta += Time.deltaTime;    //数を数える


        if (this.delta > this.span)   //スパンまで加算したら
        {
            this.delta = 0;
            this.a = Random.Range(1, 5);     //ランダムに方向転換
        }

        //歩く速度を計測する
        this.nowSpd= Mathf.Abs(this.GetComponent<Rigidbody>().velocity.x)+ Mathf.Abs(this.GetComponent<Rigidbody>().velocity.z); 	//歩く速度を計測。

        //壁にハマって動かなくなるのを防止。移動速度が極端に低いということは壁にハマっとる。方向転換させる。
        if(this.nowSpd < 1) { this.a = Random.Range(1, 5); }


        if (this.a == 1)    //左下
        {
            if (this.nowSpd < maxSpd)
            {
                this.GetComponent<Rigidbody>().AddForce(transform.right * 1 * powX);
                this.GetComponent<Rigidbody>().AddForce(transform.forward * 1 * powZ);
            }
        }

        if (this.a == 2)    //右上
        {
            if (this.nowSpd < maxSpd)
            {
                this.GetComponent<Rigidbody>().AddForce(transform.right * -1 * powX);
                this.GetComponent<Rigidbody>().AddForce(transform.forward * -1 * powZ);
            }
        }

        if (this.a == 3)    //左上
        {
            if (this.nowSpd < maxSpd)
            {
                this.GetComponent<Rigidbody>().AddForce(transform.right * 1 * powX);
                this.GetComponent<Rigidbody>().AddForce(transform.forward * -1 * powZ);
            }
        }

        if (this.a == 4)    //右下
        {
            if (this.nowSpd < maxSpd)
            {
                this.GetComponent<Rigidbody>().AddForce(transform.right * -1 * powX);
                this.GetComponent<Rigidbody>().AddForce(transform.forward * 1 * powZ);

            }
        }
    }


これですり抜けなくなった^^v

↑このゲームはこちらで公開中↓

Google Play で手に入れよう
ー広告ー

-Unity

© 2024 Bou.O The World Powered by AFFINGER5