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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

2043閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/02/24 13:22

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

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class 砲弾PS : MonoBehaviour 6{ 7 int tf = 0; 8 public float k = 0; 9 public float moveSpeed = 16f; 10 float kz = 0; 11 float xx = 0; 12 float zz = 1; 13 float si(float ki, int kf) 14 { 15 float a_1 = ki - kf; 16 float a_2 = a_1 * -1f; 17 float a_3 = 1.11111111f * a_2; 18 float a_4 = a_3 / 100; 19 return a_4; 20 } 21 void Start() 22 { 23 tf = 0; 24 Transform my2Transform = GetComponent<Transform>(); 25 26 Quaternion qi = transform.rotation; 27 k = transform.rotation.eulerAngles.y; 28 if (k == 0) { zz = 1; } 29 else 30 { 31 if (k < 90 && k > 0) 32 { 33 kz = si(k, 90); 34 zz = kz; 35 xx = 1 - kz; 36 if (k < 45) 37 { 38 if (k <= 22.5) 39 { 40 xx = xx+ k * (xx * 0.004809f); 41 zz = zz+ k * (zz * -0.004809f); 42 } 43 else { float kp = -k + 45; 44 xx = xx; //+ k * (xx * 0.004809f); 45 zz = zz; //+ k * (zz * -0.004809f); 46 } 47 } 48 } 49 50 else 51 { 52 if (k == 90) 53 { 54 xx = 1; zz = 0; 55 } 56 57 if (k < 180 && k > 90) ; 58 { 59 kz = si(k, 90); 60 xx = zz + kz; 61 zz = kz; 62 } 63 if (k == 180 || k == -180) { zz = -1; } 64 65 if (k < 0 && -90 < k) 66 { 67 kz = si(k, -90); 68 xx = -1 - kz; 69 zz = -kz; 70 71 } 72 if (k == -90) { xx = -1; zz = 0; } 73 } 74 } 75 } 76 77 void Update() 78 { 79 80 } 81 82 void FixedUpdate() 83 { 84 85 if (tf <= 99) 86 { 87 Vector3 pos = transform.position; 88 pos.z = pos.z + zz * -moveSpeed; 89 pos.x = pos.x + xx * -moveSpeed; 90 transform.position = pos; 91 tf++; 92 93 } 94 //else { Destroy(gameObject); } 95 } 96 97}

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

c#

1if (k <= 22.5) 2 { 3 xx = xx+ k * (xx * 0.004809f); 4 zz = zz+ k * (zz * -0.004809f); 5 } 6

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

C#

1Vector3 dir; 2 3void Start () { 4 transform.rotation = 向かせたい方向; 5 dir = transform.forward; //オブジェクトが現在向いている方向のベクトル(長さ1)が取れる 6} 7 8void FixedUpdate () { 9 transform.position += dir * 適当な倍率; 10}

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

投稿2019/02/24 16:50

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/24 17:55

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

2019/02/24 18:13 編集

単純に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/24 19:08

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

0

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

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

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

投稿2019/02/24 14:26

ponzu

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/24 15:08

if (k <= 22.5) { xx = xx+ k * (xx * 0.004809f); zz = zz+ k * (zz * -0.004809f); } がなくてもずれはあります。
退会済みユーザー

退会済みユーザー

2019/02/24 15:35

0.004809fはrotation.xを-90度,rotation.zを22.5度傾けたScale.yを111111にしたカプセルを二つ用意して片方をposition.x=-2500,position.y=0.position.z=-7500にして(もう片方のpositionは全部0) position.xの数値を減らしてposition.zにxで減らした数値の三倍足して両方のカプセルが接触した時の (position.x + 2500)*-1+(position.x+7500)を1万で割ってその数値を22.5で割った値。
退会済みユーザー

退会済みユーザー

2019/02/24 15:37

間違えました×*-1+(position.x+7500)〇*-1+(position.z+7500)
退会済みユーザー

退会済みユーザー

2019/02/24 16:03

↑に書いてあるカプセルはrotation.zが22.5度の場合position.xに-0.25,position.zに-0.75進んだ時のずれを一万倍にしたものです rotation.zが45度でposition.xに0.5,position.zに0.5進んだ場合一万倍にしてもずれはほぼありません
退会済みユーザー

退会済みユーザー

2019/02/24 16:05

なにか法則があると思い係数を探しました。
ponzu

2019/02/24 17: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メソッド?毎に、前回更新した位置を基準に再計算して誤差を累積していませんか?
ponzu

2019/02/24 17:15

結局、私はチュッパチャップスの例のような疑念を持っているわけです。 移動物体を管理するクラスに、”移動開始時”の”時間”、"位置"を保持するメンバを追加して、更新時に”移動開始時”の位置、移動角度、移動開始時からの経過時間で、新しい位置を算出してみてはいかがでしょう。 みたところ、単位移動速度、移動角度は不変なようですから。
退会済みユーザー

退会済みユーザー

2019/02/24 18: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の掛ける値を同じにするためです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問