質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

等速直線運動で真っ直ぐに進まない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,449
退会済みユーザー

退会済みユーザー

実現したいこと
自オブジェクトの向きに等速直線運動で動かす。
発生した問題
オブジェクトが真っ直ぐ進まない角度がある。
*コード*

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

public class 砲弾PS : MonoBehaviour
{
    int tf = 0;
    public float k = 0;
    public float moveSpeed = 16f;
    float kz = 0;
    float xx = 0;
    float zz = 1;
    float si(float ki, int kf)
    {
        float a_1 = ki - kf;
        float a_2 = a_1 * -1f;
        float a_3 = 1.11111111f * a_2;
        float a_4 = a_3 / 100;
        return a_4;
    }
    void Start()
    {
        tf = 0;
        Transform my2Transform = GetComponent<Transform>();

        Quaternion qi = transform.rotation;
        k = transform.rotation.eulerAngles.y;
        if (k == 0) { zz = 1; }
        else
        {
            if (k < 90 && k > 0)
            {
                kz = si(k, 90);
                zz = kz;
                xx = 1 - kz;
                if (k < 45)
                {
                    if (k <= 22.5)
                    {
                        xx = xx+ k * (xx * 0.004809f);
                        zz = zz+  k * (zz * -0.004809f);
                    }
                    else { float kp = -k + 45;
                        xx = xx; //+ k * (xx * 0.004809f);
                        zz = zz; //+  k * (zz * -0.004809f);
                    }
                }
            }

            else
            {
                if (k == 90)
                {
                    xx = 1; zz = 0;
                }

                if (k < 180 && k > 90) ;
                {
                    kz = si(k, 90);
                    xx = zz + kz;
                    zz = kz;
                }
                if (k == 180 || k == -180) { zz = -1; }

                if (k < 0 && -90 < k)
                {
                    kz = si(k, -90);
                    xx = -1 - kz;
                    zz = -kz;

                }
                if (k == -90) { xx = -1; zz = 0; }
            }
        }
    }

    void Update()
    {

    }

    void FixedUpdate()
    {

        if (tf <= 99)
        {
            Vector3 pos = transform.position;
            pos.z = pos.z + zz * -moveSpeed;
            pos.x = pos.x + xx * -moveSpeed;
            transform.position = pos;
            tf++;

        }
        //else { Destroy(gameObject); }
    }

}


*試したこと*
360の中の45で割れる角度-22.5に近づくたびずれが大きくなる。(0~90度でしか試してない)

if (k <= 22.5)
                    {
                        xx = xx+ k * (xx * 0.004809f);
                        zz = zz+  k * (zz * -0.004809f);
                    }


のようなコードを加えると11.5に近づくたびずれが多くなる。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

単に直線移動させるだけなら以下で出来ると思います。

Vector3 dir;

void Start () {
    transform.rotation = 向かせたい方向;
    dir = transform.forward;  //オブジェクトが現在向いている方向のベクトル(長さ1)が取れる
}

void FixedUpdate () {
    transform.position += dir * 適当な倍率;
}

もしも手計算で底辺や高さと角度から斜辺の長さを求めようとする場合、三角関数が必要かと思います。
メソッドが用意済みなのでそちらを使ってみてください。
数学系の処理を扱うMathfの全変数と全関数【Unity】 - (:3[kanのメモ帳]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/25 02:55

    rotationがx=-90,y=0,z=11.25の場合
    dir = transform.forward;では
    dir.x=0,dir.y=1,dir.z=0になりましたなぜですか。

    キャンセル

  • 2019/02/25 03:11 編集

    単純にfloatをstringに変換すると端数が省略されるから。
    そして「実際にその方向を向いているから」です。

    Debug.Log ( transform.forward.ToString("G") );
    で確認したところ、(0, 1, 1.676381E-08) になったので、実際はZ軸方向にもちょっとだけ向いています。
    (Eの入った数字の読み方はコチラ参照→ http://aoki2.si.gunma-u.ac.jp/Hanasi/StatTalk/fudoushousuu.html

    そして「transform.forward」は「自オブジェクトの+Z軸に伸びるベクトル」です。
    人間で言うと、
    自分の顔が向いている方向=+Z軸=transform.forward
    自分の後頭部が向いている方向=-Z軸=transform.back
    自分の右手がある方向=+X軸=transform.right
    自分の左手がある方向=-X軸=transform.left
    頭上(つむじが向いている)方向=+Y軸=transform.up
    足元(足がある)方向=-Y軸=transform.down
    になります。

    rotationがx=-90,y=0,z=11.25の場合、仰向けに倒れている状態になるので、transform.forwardがおおよそ(0,1,0)になるのは正しい結果です。
    もし向きの基準が違う場合は「transform.forward」の部分を上記のいずれかに置き換えればその方向のベクトルが取れます。(例えば同じrotationでtransform.rightを求めると(0.9807853, 0, -0.1950903)になります)

    キャンセル

  • 2019/02/25 04:08

    dir = transform.up;にした結果
    目的の方向に飛びましたありがとうございました。

    キャンセル

0

最初に、何かしらの単位係数(0.0048..)(だとおもわれる値)を小数で決めている。
その小数単位係数を(おそらく角度に関する何かしらの)変数(k)で乗じて(おそらく物体の移動に関するなにかしらの)変数(xx|zz)を決定している。
さらに更新の度にその(おそらく物体の移動に関する)変数を(おそらく単位移動定数だと思われる)変数(moveSpeed)で乗じて(おそらく物体の位置に関する)変数(pos)に加算していくと。

「私はチュッパチャプスを、300舐めで舐め尽くすから、ひと舐め0.003チュッパ! 1年で365チュッパ! 私の残り50年の人生の目標、18250チュッパ達成することにする。」
・・・50年後 (0.003*300*365*50 = 16425)
「1825チュッパ足りんかった!!」 的な?

コードの一部でかいま見えるのはこんな風ですかね?ここのコード外に原因が有るかもしれませんし無いかもしれません。私には特定出来ません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/25 02:04

    xz平面上に、点A(x,z)=(-2500,-7500)が有り、関数 z=3xの軌道に沿って原点に向かっていく。okですか?

    rotation.x (,.y,.z)とは、移動物体の方向を定義する変数?
    移動物体には大きさの概念がある?
    Scale.yとは、その移動物体の元の大きさに対しての拡大・縮小比率?
    position.x(,.y,.z)で管理しているのは物体の位置?
    物体動詞の接触とは、position.x(,.y,.z)で管理された点の接触?
    それとも大きさの概念を持っていてその表面同士の接触?
    接触時に計算された0.004809は、どう云う意図で何を担う定数なんでしょうか?

    移動物体の初期位置と移動角度、単位時間あたりの移動距離が決定していれば、射出からの経過時間での物体の位置は微小な誤差で1回で計算できるんではないでしょうかね? フレーム?更新?FixedUpdateメソッド?毎に、前回更新した位置を基準に再計算して誤差を累積していませんか?

    キャンセル

  • 2019/02/25 02:15

    結局、私はチュッパチャップスの例のような疑念を持っているわけです。

    移動物体を管理するクラスに、”移動開始時”の”時間”、"位置"を保持するメンバを追加して、更新時に”移動開始時”の位置、移動角度、移動開始時からの経過時間で、新しい位置を算出してみてはいかがでしょう。
    みたところ、単位移動速度、移動角度は不変なようですから。

    キャンセル

  • 2019/02/25 03:46

    xxとzzはstart関数の1回しか定義していません
    ↑のカプセルは軌道確認のための棒なのでスクリプトは付けていません
    分かっていないようなので
    position.x.0,y.0,z.0
    rotation.x.-90,y.0,z.22.5
    scale.x.1,y.111111,z.1
    のカプセルを二つ用意して
    片方のpositionをposition.x.-2500,y.0,z.-7500にしてください
    するとpositionを変えていない方とそうじゃない方は接触していないと思います
    positionを変えた方のpositionをx.-2770.5,y.0,z.-6688.5にしてください
    接触していると思います
    ちなみにxだけ減らしてzをいじらなくてもzを足してxをいじらなくても接触させることができます
    zにxで減らした値の三倍足したのはコードのzzとxxの掛ける値を同じにするためです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る