前提・実現したいこと
実現したいことはタイトル通りなのですが、補足するとAのスクリプト内のUpdate関数で変数の値を更新している変数を、Bの別のスクリプトで取得し、Bのスクリプト内で取得した値を使いたいです。
Aのスクリプトはカメラの処理、Bのスクリプトはプレイヤーの移動の処理をしています。
該当のソースコード
C#
1// Aのスクリプト 2// カメラ処理 3// 関係のないと判断したソースは消してあります。 4 public class CameraManager : MonoBehaviour 5 { 6 private CameraType _cameraType; 7 8 private GameObject _camera; 9 private GameObject _player; 10 11// 取得したい変数 12 private Quaternion _hRotation; // 垂直回転(X軸を軸とする回転) 13 14 private CameraPrameter _cameraPrameter; 15 private float _cameraSpeed; 16 private float _forwardDis; 17 private float _upDis; 18 19 // 障害物とするレイヤー 20 // Defaultに設定 21 [SerializeField] 22 private LayerMask obstacleLayer; 23 24// 取得したい変数のプロパティ 25 public Quaternion HRotation 26 { 27 get { return _hRotation; } 28 } 29 30 private void Start() 31 { 32 _camera = GameObject.FindGameObjectWithTag("MainCamera"); 33 _player = GameObject.FindGameObjectWithTag("Player"); 34 35 _hRotation = Quaternion.identity; 36 37 // CameraPrameter反映 38 _cameraPrameter = GetComponent<CameraPrameter>(); 39 _cameraSpeed = _cameraPrameter.PlayerCameraSpeed; 40 _forwardDis = _cameraPrameter.PlayerCameraForwardDis; 41 _upDis = _cameraPrameter.PlayerCameraUpDis; 42 43 _cameraType = CameraType.Player; // 仮 44 } 45 46 private void Update() 47 { 48 switch (_cameraType) 49 { 50 case CameraType.Player: 51 float mouseX = Input.GetAxis("Mouse X"); 52 Player(mouseX, _cameraSpeed, _forwardDis, _upDis); 53 break; 54 default: 55 break; 56 } 57 } 58 59// カメラがプレイヤーを写すときの処理 60 private void Player(float mouseX, float cameraSpeed,float forwardDis,float upDis) 61 { 62 _hRotation *= Quaternion.Euler(0, mouseX * cameraSpeed, 0); 63 _camera.transform.rotation = _hRotation; 64 _camera.transform.position = _player.transform.position - (_camera.transform.rotation * Vector3.forward * forwardDis - _camera.transform.rotation * Vector3.up * upDis); 65 66 RaycastHit hit; 67 // キャラクターとカメラの間に障害物があったら障害物の位置にカメラを移動させる 68 if (Physics.Linecast(_player.transform.position, _camera.transform.position, out hit, obstacleLayer)) 69 { 70 _camera.transform.position = hit.point; 71 } 72 // レイを視覚的に確認 73 Debug.DrawLine(_player.transform.position, _camera.transform.position, Color.red, 0f, false); 74 } 75 }
C#
1// Bのスクリプト 2// プレイヤーの移動処理 3// 関係のないと判断したソースは消してあります。 4 public class PlayerMover : BasePlayerComponent 5 { 6 private PlayerPrameter _playerPrameter; 7 private CameraManager _cameraManager; 8 9 private float _moveSpeed; 10 private float _rotSpeed; 11 12 // GameManagerオブジェクト検索用 13 //private GameObject _gameManager; 14// 取得した変数を入れる用。 15 private Quaternion _hRotation; 16 17 protected override void OnStart() 18 { 19// 特に何もしていないので記述しません。 20 base.OnStart(); 21 22 _playerPrameter = GetComponent<PlayerPrameter>(); 23 _cameraManager = GetComponent<CameraManager>(); 24 25 _moveSpeed = _playerPrameter.MoveSpeed; 26 _rotSpeed = _playerPrameter.RotSpeed; 27 28 //_gameManager = GameObject.Find("GameManager"); 29 //_hRotation = _gameManager.GetComponent<CameraManager>().HRotation; 30// 取得したプロパティの値を入れいます。 31 _hRotation = _cameraManager.HRotation; 32 } 33 34 // プレイヤー移動 35// 引数はコントローラー入力の値を入れる用です。 36 public void PlayerMove(float h, float v) 37 { 38// 進行方向を決める。 39 Vector3 velocity = Vector3.zero; 40 float speedExe = _moveSpeed * Time.deltaTime; 41 42 if (v > 0) 43 { 44 velocity.z -= 1; 45 } 46 if (v < 0) 47 { 48 velocity.z += 1; 49 } 50 if (h > 0) 51 { 52 velocity.x -= 1; 53 } 54 if (h < 0) 55 { 56 velocity.x += 1; 57 } 58 59 velocity = velocity.normalized * speedExe; 60 61// カメラ位置とは反対方向にプレイヤーを移動させる処理 62// ここで_hRotation のあたいが反映されない 63 if (velocity.magnitude > 0) 64 { 65 transform.rotation = Quaternion.Slerp(transform.rotation, 66 Quaternion.LookRotation(_hRotation * -velocity), 67 _rotSpeed); 68 69 // プレイヤーの位置(transform.position)の更新 70 // カメラの水平回転(refCamera.hRotation)で回した移動方向(velocity)を足し込む 71 transform.position += _hRotation * -velocity; 72 } 73 } 74 }
補足情報(FW/ツールのバージョンなど)
Windows10
Visual Studio 2019
Unity 2020.3.17f
追記
問題が解決したので追記です。
このやり方だと特定のオブジェクトに.csをアタッチし、それを特定のオブジェクトにドラッグ&ドロップしなければいけないのであまり好ましいやり方ではないです。
参考にされた方でもっとスマートなやり方があればこの記事の返答欄で教えていただけると助かります。
自分でも調べてみるのでまたわかったらここに書きます。
C#
1 public class PlayerMover : BasePlayerComponent 2 { 3 private PlayerPrameter _playerPrameter; 4 5// ここで直接CameraManager を付けたオブジェクトをアタッチし、情報を持ってきている。 6 [SerializeField] 7 private CameraManager _cameraManager; 8 9 private float _moveSpeed; 10 private float _rotSpeed; 11 12 protected override void OnStart() 13 { 14 base.OnStart(); 15 16 _playerPrameter = GetComponent<PlayerPrameter>(); 17 18 _moveSpeed = _playerPrameter.MoveSpeed; 19 _rotSpeed = _playerPrameter.RotSpeed; 20 } 21 22 // プレイヤー移動 23 public void PlayerMove(float h, float v) 24 { 25 Vector3 velocity = Vector3.zero; 26 float speedExe = _moveSpeed * Time.deltaTime; 27 28 if (v > 0) 29 { 30 velocity.z -= 1; 31 } 32 if (v < 0) 33 { 34 velocity.z += 1; 35 } 36 if (h > 0) 37 { 38 velocity.x -= 1; 39 } 40 if (h < 0) 41 { 42 velocity.x += 1; 43 } 44 45 velocity = velocity.normalized * speedExe; 46 47 if (velocity.magnitude > 0) 48 { 49 transform.rotation = Quaternion.Slerp(transform.rotation, 50 Quaternion.LookRotation(_cameraManager.HRotation * -velocity), 51 _rotSpeed); 52 53 // プレイヤーの位置(transform.position)の更新 54 // カメラの水平回転(refCamera.hRotation)で回した移動方向(velocity)を足し込む 55 transform.position += _cameraManager.HRotation * -velocity; 56 } 57 } 58 }
回答1件
あなたの回答
tips
プレビュー