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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

1741閲覧

3D/Unity オブジェクトの正面より少し上にAddForceしたい

paraprara

総合スコア3

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/07/12 02:16

編集2021/07/12 02:58

どういった場面なのか

プレイヤーが放射状にオブジェクトを生成、撃ちだす場面でつまずいでいる

実現したいこと

タイトルの通り、オブジェクトの向いている真正面ではなく少し上に向けてAddForceしたいです。
また上げる際には角度を指定してその角度分軌道を変えたいです。
今のところ、直接座標を加えて上に上げる事は成功しているのですが...
どうしても角度で変えていきたいので皆様のアドバイスを頂きたいです。

※ 画像では2Dですが、3Dです。
イメージ説明

該当のソースコード

using System.Collections; using UnityEngine; // 生成するオブジェクトにつける public class TestThrow : MonoBehaviour { private float throwForcePow = 1200f; private void Update() { // 30フレームに1回生成 if(Time.frameCount % 30 == 0) { // 作って、座標を生成元に合わせて、必要なコンポーネント付けて、飛ばす GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube); obj.transform.position = transform.position; obj.transform.rotation = transform.rotation; obj.AddComponent<AutoDestroy>(); Rigidbody rb = obj.AddComponent<Rigidbody>(); // 直接座標を加えて上奥に向けることで上に飛ばせているが...目的の角度を狙うとなるとかなりトライ&エラー rb.AddForce(obj.transform.forward + new Vector3(0,0.3f,0.3f) * throwForcePow); } } } // 生成されたオブジェクトにつける public class AutoDestroy : MonoBehaviour { // これより下に下がったら破棄する private float deathPosY = -30f; private void Update() { if (transform.position.y < deathPosY) Destroy(gameObject); } }

試したこと

射出速度を計算して飛ばす方法をインターネットで見つけたのですが、場合によって算出が不可能な場面があったのでその方法は使えませんでした。
参考 https://qiita.com/_udonba/items/a71e11c8dd039171f86c

解決しました。

回答者様から三角関数とやらを使い new Vector3(0,0.3f,0.3f)を変えれば良いとの答えを頂きましたので
「Unity sin cos 回転」と調べたところ以下のように置き換えたらちゃんと動きました。

// 30度上に飛ばす float angle = 30f; Vector3 dir = new Vector3(0, Mathf.Sin(angle * Mathf.Deg2Rad), Mathf.Cos(angle * Mathf.Deg2Rad)); rb.AddForce(obj.transform.forward + dir * throwForcePow);

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

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

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

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

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

guest

回答2

0

話(何に行き詰っているのか?という問題点)がよくわかりませんが,

所望の角度方向のベクトルを三角関数で作り出せばよいのではないのでしょうか?


※ 画像では2Dですが、3Dです。

ああ,「真正面」が3D空間内でどっちを向いているかというのが固定ではない,という話なのかな?
であれば…

tranform.forword が「真正面」を指すベクトルなのであれば,こいつを所望の角度だけ「上下に」回転させてやれば良いでしょう.
これは回転軸に transform.right とかを使えばよいのではないかと.

投稿2021/07/12 02:35

編集2021/07/12 02:44
fana

総合スコア11996

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

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

paraprara

2021/07/12 02:51

> 所望の角度方向のベクトルを三角関数で作り出せばよいのではないのでしょうか? 恐らくこれで合ってると思います。実際に検索したらすぐにHITしたので... 今回は私の数学知識不足でした、申し訳ないです。
guest

0

ベストアンサー

角度を指定したいのなら、
rb.AddForce(obj.transform.forward + new Vector3(0,0.3f,0.3f) * throwForcePow);

ここの引数を、new Vector3(cosθのやつ、sinθのやつ、0f) * throwForcePow
みたいな感じで出来そうかなと、(θが角度)
正式な書き方は調べてください。
「Unity sin cos」で検索すれば色々出ると思うので

投稿2021/07/12 02:34

kyooo_

総合スコア104

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

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

paraprara

2021/07/12 02:50

おぉ...出来ました。 ただ勉強をサボったつけが今来ましたね... 中学校時代の教科書を引っ張ってこようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問