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

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

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

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

解決済

[Unity3D] cinemachine カメラが対象を追いかけてマウスを左右の動かすとカメラがプレイヤーを中心に回転する動作を実装したい。

samidare_chan
samidare_chan

総合スコア142

Unity3D

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

1回答

-2評価

1クリップ

407閲覧

投稿2022/03/19 07:53

編集2022/03/19 18:09

提示プロパティですが以下の動作を実現したいのですが色々パラメーターを触りましたが方法がわかりません。これはどうやって実装するのでしょうか?現状ではキャラクターが動くとカメラがキャラクターの背後に合わってしまいやりたい事とは違います。左右は実装出来たのですが上下が実装出来ません。提示画像の赤い円の上下版みたいな操作を実装したいです。

実現したい事

モンハン、マリオ64等であるプレイヤーを中心にカメラが回転移動して、カメラから見た方向にプレイヤーが移動するというカメラ処理です。

参考サイト:https://qiita.com/vodef6/items/e107a110d16f02d6530a
参考サイト:https://light11.hatenadiary.com/entry/2019/10/24/220542

イメージ説明
イメージ説明

Camera

cs

using System.Collections; using System.Collections.Generic; using Cinemachine; using UnityEngine; public class CameraControl : MonoBehaviour { public GameObject player; //public CinemachineVirtualCamera camera; public float rotateSpeed = 5; //回転速度 private Vector3 offset; //プレイヤーとの距離 // Start is called before the first frame update void Start() { //camera = GetComponent<CinemachineVirtualCamera>(); offset = player.transform.position; } // Update is called once per frame void Update() { Rotate(); //カメラ回転 } void LateUpdate() { Move(); //追尾 } /*########################################## 追尾 ##########################################*/ private void Move() { //transform.position += player.transform.position - offset; offset = player.transform.position; } /*########################################## 回転 ##########################################*/ private void Rotate() { float inputHorizontal = Input.GetAxis("Right_Horizontal"); float inputVertical = Input.GetAxis("Right_Vertical"); Vector3 angle = new Vector3(inputHorizontal, 0, inputVertical); if(angle.magnitude > 0.4) { //GetComponent<CinemachineVirtualCamera>().GetCinemachineComponent<CinemachineOrbitalTransposer>().m_Heading.m_Bias += inputHorizontal * rotateSpeed; //Biasを操作 GetComponent<CinemachineVirtualCamera>().GetCinemachineComponent<CinemachineOrbitalTransposer>().m_FollowOffset.y -= inputVertical * rotateSpeed; //Biasを操作 //transform.RotateAround(player.transform.position, Vector3.up, inputHorizontal * rotateSpeed); transform.RotateAround(player.transform.position, transform.right, inputVertical * rotateSpeed); } } }
Player

cs

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerControl : MonoBehaviour { public GameObject camera; [SerializeField] const float walkSpeed = 10; //移動速度 [SerializeField] const float fallSpeed = 15; //落下速度 private Vector3 moveSpeed; private CharacterController controller; private Animator animator; private GameObject nowWeapon; // Start is called before the first frame update void Start() { controller = GetComponent<CharacterController>(); animator = GetComponent<Animator>(); nowWeapon = transform.Find("Weapon").GetComponent<WeaponManager>().Weapon_1(); } // Update is called once per frame void Update() { Move(); Fall(); Vector3 move = Vector3.Scale(moveSpeed,new Vector3(1,0,1)); animator.SetFloat("moveSpeed",move.magnitude); animator.SetBool("isWeapon",false); ChangeWeapon(); controller.Move(moveSpeed * Time.deltaTime); //移動 } /*########################################## アニメーション ##########################################*/ private void Animation() { } /*########################################## 武器 切り替え ##########################################*/ private void ChangeWeapon() { if(Input.GetKeyDown(KeyCode.Alpha2) == true) { nowWeapon = transform.Find("Weapon").GetComponent<WeaponManager>().Weapon_2(); transform.Find("Weapon").GetComponent<WeaponManager>().ChangeWeapon(); } } /*########################################## 移動 ##########################################*/ private void Move() { float inputHorizontal = Input.GetAxis("Horizontal"); float inputVertical = Input.GetAxis("Vertical"); var horizontalRotation = Quaternion.AngleAxis(Camera.main.transform.eulerAngles.y,Vector3.up); var velocity = horizontalRotation * new Vector3(inputHorizontal, 0, inputVertical).normalized; if (velocity.magnitude > 0.1f) { transform.rotation = Quaternion.LookRotation(velocity, transform.up); moveSpeed = velocity * walkSpeed; } else { moveSpeed = new Vector3(0,0,0); } } /*########################################## 落下 ##########################################*/ private void Fall() { moveSpeed.y = -fallSpeed; } }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Unity3D

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