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

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

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

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

Unity3D

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

解決済

指定した座標に向けて放物線を描くように移動させたい

kentyann
kentyann

総合スコア1

C#

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

Unity3D

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

1回答

0リアクション

0クリップ

469閲覧

投稿2022/07/23 10:15

実現したいこと

Unityで現在地からクリックした地点まで放物線を描くように動かしたいです。
また、移動速度は調整できるようにしたいです。

試したこと①

初めにSlerp関数を使ってみましたが、孤の方向を操作できず、孤が横に向いてしまい放物線になりません。

恥ずかしながら線形補完の数学的な理屈はふんわりとしか理解できてません…
また機能(関数)としても使うのは初めてです。
知らないだけで引数などで孤の方向を指定できるのであれば話は早いのですが…

cs

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Throw : MonoBehaviour { /* * 1.マウスクリック * 2.クリックされた座標を取得 * 3.取得した座標にSleap関数で移動 */ //落下地点(クリックした座標) Vector3 ThrowPoint = new Vector3(0, 0, 0); //投げるスピード public float speed = 10; //投げるフラグ bool Throwing = false; float distance_two = 0; private void Update() { print(Input.mousePosition); print("world;"+Camera.main.ScreenToWorldPoint(Input.mousePosition)); _Throw(); } void _Throw() { //左クリック時のマウス座標を取得 if (Input.GetMouseButtonDown(0)) //&& !Throwing) { //スクリーン座標からワールド座標に変換してから代入 var MousePos = Input.mousePosition; var ScreenPos = new Vector3(MousePos.x, MousePos.y, 40f); ThrowPoint = Camera.main.ScreenToWorldPoint(ScreenPos); ThrowPoint.y = 1; print(ThrowPoint); //二点間の距離を代入(スピード調整に使う) distance_two = Vector3.Distance(transform.position, ThrowPoint); Throwing = true; } if (Throwing) { // 現在の位置 float present_Location = (Time.time * speed) / distance_two; // オブジェクトの移動 transform.position = Vector3.Slerp(transform.position, ThrowPoint, present_Location); } } }

試したこと②

次にRigidbodyのAddForceで物理的に目的地まで角度をつけて発射するやり方を見つけたのですが速度をコントロールする方法わかりません。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Throw2 : MonoBehaviour { /* * 1.マウスクリック * 2.クリックされた座標を取得 * 3.取得した座標にSleap関数で飛ばす */ //落下地点(クリックした座標) Vector3 ThrowPoint = new Vector3(0, 0, 0); // 射出角度 public float ThrowingAngle = 60; private void Update() { _Throw(); } void _Throw() { //左クリック時のマウス座標を取得 if (Input.GetMouseButtonDown(0)) { //スクリーン座標からワールド座標に変換してから代入 var MousePos = Input.mousePosition; var ScreenPos = new Vector3(MousePos.x, MousePos.y, 40f); ThrowPoint = Camera.main.ScreenToWorldPoint(ScreenPos); ThrowPoint.y = 1; Throwing(); } } private void Throwing() { // 射出速度を算出 Vector3 velocity = CalculateVelocity(transform.position, ThrowPoint, ThrowingAngle); // 射出 Rigidbody rid = this.GetComponent<Rigidbody>(); rid.AddForce(velocity * rid.mass, ForceMode.Impulse); } private Vector3 CalculateVelocity(Vector3 pointA, Vector3 pointB, float angle) { // 射出角をラジアンに変換 float rad = angle * Mathf.PI / 180; // 水平方向の距離x float x = Vector2.Distance(new Vector2(pointA.x, pointA.z), new Vector2(pointB.x, pointB.z)); // 垂直方向の距離y float y = pointA.y - pointB.y; // 斜方投射の公式を初速度について解く float speed = Mathf.Sqrt(-Physics.gravity.y * Mathf.Pow(x, 2) / (2 * Mathf.Pow(Mathf.Cos(rad), 2) * (x * Mathf.Tan(rad) + y))); if (float.IsNaN(speed)) { // 条件を満たす初速を算出できなければVector3.zeroを返す return Vector3.zero; } else { return (new Vector3(pointB.x - pointA.x, x * Mathf.Tan(rad), pointB.z - pointA.z).normalized * speed); } } }

こちらのサイト(https://qiita.com/_udonba/items/a71e11c8dd039171f86c)
を参考にしました(発射機構ほぼコピってます)

追記

  • 後々調整しやすそうなので、できればSlerp関数で実現したいと考えています。

  • teratailを使うのは初めてなので、使い方や書き方に至らぬ点があるかもしれませんがご容赦ください。

もしそういった点があれば教えていただけると幸いです。

  • C#、Unityについても初心者なので細かく教えていただけるとありがたいです。

補足情報(FW/ツールのバージョンなど)

Unity:2021.3.5.f1

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C#

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

Unity3D

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