【unity】物理演算、GetAxisに関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
rau

【unity】物理演算、GetAxisに関して

#1

投稿記事 by rau » 6年前

現在unityでドローンのシミュレーションを作っています。

実際のドローンを想定してゲームパッドを用いるのですが、どうも処理がうまく書けなくて困っております。


内容としては、
一番初めにTakeoffを実行し、ある程度の高さまで上昇したら停止させます。
その後、前進後退、左右、上下の操作を行えるようにしています。
前進後退、左右の操作は右スティック、上下の操作は左スティックで行います。

この際、スティックを倒したら移動し、離したら止まるようにしたいのですが、うまくいかなくて離陸後ずっと止まったままになってしまいます。ソースコードは以下です。

コード:

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

public class Move : MonoBehaviour {

	// Use this for initialization

    Rigidbody rigid;
    Vector3 start_force,move_force;
   
    bool flag=true;

	void Start () {
        this.rigid = GetComponent<Rigidbody>();
        
	}
	
	// Update is called once per frame
	void Update () {

        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
        float h2 = Input.GetAxisRaw("Horizontal2");
        float v2 = Input.GetAxisRaw("Vertical2");

        //離陸
        if (flag)
        {
            if (Input.GetButtonDown("Takeoff"))
            {
                start_force = new Vector3(0.0f, 50.0f, 0.0f);
                this.rigid.AddForce(start_force);
                Invoke("Stop", 2.0f);
                flag = false;
            }
        }
        
ここまでが離陸までの処理で、Stopメソッドの内容は rigid.velocity = Vector3.zero; です。
操作関連が以下です。(上記ソースコードの続きです。)

コード:

else if(flag==false) {
            //アナログスティック
                //左右
            if (h2 == 1)
            {  
                move_force = new Vector3(0.0f, 0.0f, 1.0f);
                this.rigid.velocity=move_force;   
            }

            if (h2 == -1)
            {
                move_force = new Vector3(0.0f, 0.0f, -1.0f);
                this.rigid.velocity = move_force;

            }

                //前進後退
            if (v2 ==-1)
            {
                move_force = new Vector3(-1.0f, 0.0f, 1.0f);
                this.rigid.velocity = move_force;
                
            }
                
            if (v2==1)
            {
                move_force = new Vector3(1.0f, 0.0f, 1.0f);
                this.rigid.velocity = move_force;
                
            }


                //上下
            if (v == -1)
            {
                move_force = new Vector3(0.0f, 1.0f, 0.0f);
                this.rigid.velocity = move_force;
            }
            if (v == 1)
            {
                move_force = new Vector3(0.0f, -1.0f, 0.0f);
                this.rigid.velocity = move_force;
               
            }
            
	    //着陸の処理
            if (Input.GetButtonDown("Takeoff")){
                Debug.Log("land");
                Land();
            }
}
public void Land()
    {
        rigid.velocity = Vector3.zero;
        
        Transform droneTransform=this.transform;
        Vector3 flight = droneTransform.position;
        Vector3 land = new Vector3(flight.x, flight.y, flight.z);

        start_force.y = -500.0f;
        this.rigid.AddForce(start_force);
                
    }

ここまでが現状のソースコードで、これに停止処理を加えたいです。
移動処理はAddforceもしくは、velocityを使用したいと考えています。
最後の着陸は離陸と同じボタンを使用しています。

停止処理に関しては、if文でh2==0のときにStopメソッドを呼び出すなどの処理を書いていたのですが、この処理だと当たり前なことに、開始時点で0なのでStopメソッドでvelocityの値が0になってしまい、これだと移動処理につなげられません。
また、スティックを元に戻したときにピタッと止まるのではなく、そのときのスピードに合わせた停止をさせたいです。(ただ慣性が働いているように見せたい)

良い書き方がないか考えていたのですが、結局思いつかず質問させていただきました。
少し分かりにくいかもしれませんが、ご教授いただけると助かります。

rau

Re: 【unity】物理演算、GetAxisに関して

#2

投稿記事 by rau » 6年前

主です。
関係ないですが、移動処理の前進後退の処理が間違っていました…
あまり触れずにお願いします。。。

返信

“C言語何でも質問掲示板” へ戻る