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

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

ただいまの
回答率

87.78%

角度を代入してAddForceで力を加える

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 430

score 37

今行っていること

bulletという球のプレハブを呼び出し、camera1のy座標、camera2のx座標をbulletに代入します。そしてその球をその向きに向けてAddForceで力を加えて発射します。

問題が発生している部分のコード

//マウスが今クリックされたか
        if (Input.GetMouseButtonDown(0))
        {
            Shoot();
        }


    }

    void Shoot()
    {
        //カメラのアングルをバレットに反映
        Vector3 cam1yAngle = Camera1Transform.localEulerAngles;
        Vector3 cam2xAngle = Camera2Transform.localEulerAngles;
        Vector3 bulletAngle;
        bulletAngle.y = cam1yAngle.y;
        bulletAngle.x = cam2xAngle.x;
        bulletAngle.z = 0f;

        Debug.Log(bulletAngle);

        GameObject newBullet = Instantiate(Bullet, spawnPointTransform.position, Quaternion.identity) as GameObject;
        newBullet.transform.rotation = Quaternion.Euler(bulletAngle);

        newBullet.GetComponent<Rigidbody>().AddForce(newBullet.transform.forward * speed, ForceMode.Force);

    }

発生してる問題

bulletは代入しようとした角度で発射されませんでした。
Debug.LogでbulletAngleの値を表示させてみると、bulletは代入した値ではなく、それよりも360度大きな値(不確かですが)で発射されていました。
360度大きな角度で発射されるのは、毎回ではありません。x座標がそうなったり、yがそうなったりすることがあります。
何度もやり方を変えて試行してみたのですが、どれもうまくいきませんでした。どの部分が問題点なのか教えてください。
(エラーメッセージは表示されません。)

環境

unity2020
3D

全体のコード

weapon, Bodyはどちらも同じオブジェクトです。

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

public class PlayerController : MonoBehaviour
{
    public GameObject Camera1;
    public GameObject Camera2;
    public GameObject Body;
    public GameObject SpawmPoint;
    public GameObject Bullet;
    public GameObject Weapon;
    private Transform Camera1Transform;
    private Transform Camera2Transform;
    private Transform bodyTransform;
    private Transform spawnPointTransform;
    private Transform bulletTransform;
    private Transform weaponTransform;
    public float speed;
    private float poscam_x;
    private float poscam_y;
    private float poscam_z;
    public float poswea_x;
    public float poswea_y;
    public float poswea_z;
    public float verticalInput;
    public float horizontalInput;
    private Rigidbody rbbody;

    // Use this for initialization
    void Start()
    {
        //入力情報を入手
        verticalInput = Input.GetAxis("Vertical");
        horizontalInput = Input.GetAxis("Horizontal");

        //トランスフォームコンポーネントを取得
        Camera1Transform = Camera1.GetComponent<Transform>();
        Camera2Transform = Camera2.GetComponent<Transform>();
        bodyTransform = Body.GetComponent<Transform>();
        spawnPointTransform = SpawmPoint.GetComponent<Transform>();
        bulletTransform = Bullet.GetComponent<Transform>();
        weaponTransform = Weapon.GetComponent<Transform>();

        //リジットボディーコンポーネントを取得
        rbbody = Body.GetComponent<Rigidbody>();
    }


    void Update()
    {
        //カメラ向き指定
        float X_Rotation = Input.GetAxis("Mouse X");
        float Y_Rotation = Input.GetAxis("Mouse Y");
        Camera1Transform.transform.Rotate(0, X_Rotation, 0);
        Camera2Transform.transform.Rotate(-Y_Rotation, 0, 0);

        float angleDir = Camera1Transform.transform.eulerAngles.y * (Mathf.PI / 180.0f);
        Vector3 dir1 = new Vector3(Mathf.Sin(angleDir), 0, Mathf.Cos(angleDir));
        Vector3 dir2 = new Vector3(-Mathf.Cos(angleDir), 0, Mathf.Sin(angleDir));


        // camera・weapon位置指定
        Vector3 poscam = Body.transform.position;
        Vector3 poswea = Body.transform.position;

        poscam.x += poscam_x;
        poscam.y += poscam_y;
        poscam.z += poscam_z;

        // 座標を設定
        Camera1.transform.position = poscam;  


        //力を加えて移動
        verticalInput = Input.GetAxis("Vertical");
        horizontalInput = Input.GetAxis("Horizontal");
        rbbody.AddForce(Camera1Transform.transform.forward * speed * verticalInput, ForceMode.Force);

        //マウスが今クリックされたか
        if (Input.GetMouseButtonDown(0))
        {
            Shoot();
        }


    }

    void Shoot()
    {
        //カメラのアングルをバレットに反映
        Vector3 cam1yAngle = Camera1Transform.localEulerAngles;
        Vector3 cam2xAngle = Camera2Transform.localEulerAngles;
        Vector3 bulletAngle;
        bulletAngle.y = cam1yAngle.y;
        bulletAngle.x = cam2xAngle.x;
        bulletAngle.z = 0f;

        Debug.Log(bulletAngle);

        GameObject newBullet = Instantiate(Bullet, spawnPointTransform.position, Quaternion.identity) as GameObject;
        newBullet.transform.rotation = Quaternion.Euler(bulletAngle);

        newBullet.GetComponent<Rigidbody>().AddForce(newBullet.transform.forward * speed, ForceMode.Force);

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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