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

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

ただいまの
回答率

87.59%

[Unity3D] 球体をプレイヤーを中心に回転させてカメラの前に表示させいたい。

受付中

回答 0

投稿 編集

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

score -136

提示コードのコメント部内部のコードですがプレイヤーの周りを周回する球体オブジェクトですがこれをプレイヤーの周り回ることを前提でカメラの前に周回させいたです。例えば左にカメラが回転したら左側に球体が周回してカメラの前に移動するという処理なのですが球体がカメラの前を向いているためこれ以上球体が回転しません。球体をカメラの前に持っていくにはどうすればいいのでしょうか?

試したこと
カメラの前方向と球体の前方向のベクトルで内積を取ってそのラジアンをtransform.RotateAround関数に入れましたが回転し続けてしまいます。

イメージ説明

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class PlayerControl : MonoBehaviour
{
    private CharacterController cc;
    private Rigidbody rb;
    private Vector3 moveForward;
    private Animator anim;

    public ItemShopMenu shop;


    [SerializeField] public List<GameObject> weaponList;

    private int weaponSelect;

    public bool isShopArea;     //ショップエリアかどうか?
    private bool isShopMenu;    //ショップ画面を開いているかどうか?

    [SerializeField] private float moveSpeed = 0.001f;  //移動速度

    //攻撃
    private GameObject weapon;
    [SerializeField] private GameObject weaponInstancePosition;

    //移動
    private float inputHorizontal;
    private float inputVertical;
    private bool isJump;


    public PlayerStatus status; //パラメータ

    //時間
    private float waitTime = 0.3f;
    private float wait;

    private float jumpTime;



    void Start()
    {
        isJump = true;
        isShopArea = false;
        isShopMenu = false;
        weaponSelect = 0;
        anim = GetComponent<Animator>();
        cc = GetComponent<CharacterController>();
        rb = GetComponent<Rigidbody>();

        //weaponList = new List<GameObject>();
        //weaponList.Add(Resources.Load("Prefabs/Bullet/Player/spear6") as GameObject);
        weapon = weaponList.Last();

    }


    private void FixedUpdate()
    {

    }


    void Update()
    {
        ShopMenu();

        if(isShopMenu == false)
        {
            AttackControl();    //攻撃
            MoveControl();      //移動
        }
    }

    void ShopMenu()
    {
        if(isShopArea == true)
        {
            if(Input.GetKeyDown(KeyCode.T))
            {
                isShopMenu = !isShopMenu;
            }
        }

        shop.isShopping = isShopMenu;


    }

    //攻撃
    void AttackControl()
    {
        if(Input.GetKeyDown(KeyCode.Q))
        {
            if(weaponSelect > 0)
            {
                weaponSelect--;
            }

            weapon = weaponList[weaponSelect];

        }
        else if (Input.GetKeyDown(KeyCode.E))
        {
            if (weaponSelect < weaponList.Count -1)
            {
                weaponSelect++;
            }

            weapon = weaponList[weaponSelect];
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////////////

        Vector3 f = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1));
        Vector3 v = (f + Camera.main.transform.right).normalized;


        if (Input.GetMouseButton(0))
        {

            if (wait >= waitTime || wait == 0)
            {
                GameObject g = Instantiate(weapon, transform.position, Quaternion.LookRotation(v));
                g.GetComponent<Bullet>().moveVector = Vector3.Scale(transform.position,v);
                g.gameObject.transform.Rotate(new Vector3(90,0,0));

                wait = 0;
            }
            wait += Time.deltaTime;
        }
        else
        {
            wait = 0;
        }

        //weaponInstancePosition.transform.RotateAround(transform.position, Vector3.up,v.x);
        Vector3 a = transform.position + v;
        Vector3 b = v;
        float c = Vector3.Dot(a,b);
        if(c != 0)
        {
        }
        weaponInstancePosition.transform.position = transform.position + v;

        //weaponInstancePosition.transform.RotateAround(transform.position, Vector3.up, Mathf.Rad2Deg * c);
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////



    }


    //移動
    void MoveControl()
    {

        if(Input.GetKey(KeyCode.W))
        {
            inputVertical = 1;
        }
        else if(Input.GetKey(KeyCode.S))
        {
            inputVertical = -1;
        }
        else
        {
            inputVertical = 0;

        }

        if (Input.GetKey(KeyCode.A))
        {
            inputHorizontal = -1;
        }
        else if (Input.GetKey(KeyCode.D))
        {
            inputHorizontal = 1;
        }
        else
        {
            inputHorizontal = 0;

        }

        Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward.normalized, new Vector3(1, 0, 1)).normalized;
        moveForward = (cameraForward * inputVertical) + (Camera.main.transform.right * inputHorizontal);

        // キャラクターの向きを進行方向
        if (moveForward != Vector3.zero)
        {
            transform.rotation = Quaternion.LookRotation(moveForward);
        }

        //ジャンプ
        if(Input.GetKeyDown(KeyCode.Space))
        {
            if(transform.GetComponentInChildren<Player_Ground_Check>().isGround == true)
            {
                cc.Move(new Vector3(0, 200, 0) * Time.deltaTime);   //落下速度
            }
        }

        if(transform.GetComponentInChildren<Player_Ground_Check>().isGround == false)
        {
            Debug.Log("Jump");
            anim.SetBool("isJump",true);                          //ジャンプアニメーション
            anim.speed = 3.5f;
        }
        else
        {
            Debug.Log("Ground");

            anim.SetBool("isJump", false);                          //ジャンプアニメーション
            anim.speed =1;
        }





        anim.SetFloat("moveSpeed",moveForward.magnitude);

        //Debug.Log(moveForward.magnitude);
        //moveForward.y = -100f;

        cc.Move(moveForward.normalized * moveSpeed * Time.deltaTime);   //移動速度
        cc.Move(new Vector3(0,-9.8f,0) * Time.deltaTime);                //落下速度

    }




    private void OnCollisionEnter(Collision collision)
    {

    }



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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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