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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1126閲覧

他スクリプトで宣言した変数を別のスクリプトで取得したい

futonmin

総合スコア33

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/09/09 01:19

編集2021/09/09 04:37

前提・実現したいこと

実現したいことはタイトル通りなのですが、補足すると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 }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

futonmin

2021/09/09 01:27

しました。前提・実現したいことに書いたことですが、Update関数内で値を更新しているのに反映されないのでなぜ反映されないのか教えてほしいということです。 分かりにくかったですね、すみません。
YAmaGNZ

2021/09/09 01:31

OnStartで_hRotationに代入した値が何もしないで更新されると考えておられるのでしょうか?
futonmin

2021/09/09 01:33

そう考えていましたが、値を反映させた関数を作らなければ反映されないですね。
YAmaGNZ

2021/09/09 01:37

クラスのようにインスタンスが格納されるような場合であれば反映されたりしますが、Quaternionはstructなので値がコピーされる動きになります。 なので、使用するタイミングで値を得る必要があります。
YAmaGNZ

2021/09/09 01:46

必要な時に _hRotation = _cameraManager.HRotation; と代入するか Quaternion.LookRotation(_cameraManager.HRotation* -velocity) と直接参照するかしてはどうでしょう?
futonmin

2021/09/09 01:55

PlayerMoverクラスのPlayerMove関数内に // 1つ目 if (velocity.magnitude > 0) { // コントローラー入力されるたびに値を更新 _hRotation = _cameraManager.HRotation; transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(_hRotation * -velocity), _rotSpeed); // プレイヤーの位置(transform.position)の更新 // カメラの水平回転(refCamera.hRotation)で回した移動方向(velocity)を足し込む transform.position += _hRotation * -velocity; } // 2つ目 if (velocity.magnitude > 0) { // 直接参照 transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(_cameraManager.HRotation * -velocity), _rotSpeed); // プレイヤーの位置(transform.position)の更新 // カメラの水平回転(refCamera.hRotation)で回した移動方向(velocity)を足し込む transform.position += _hRotation * -velocity; } と、2つ試しましたがどちらもうまくいきませんでした。
YAmaGNZ

2021/09/09 02:06

うまくいかないとはどうなるのでしょうか? _hRotation = _cameraManager.HRotation; で得た_hRotationの値が正しくないということですか?
futonmin

2021/09/09 02:14

値が反映されないということです。 [SerializeField]で_hRotationの値をみましたが、(0,0,0,0)でした。
YAmaGNZ

2021/09/09 02:19

CameraManager側のgetにてログを出力してみて値が(0,0,0,0)なのであれば 実際に動いているCameraManagerのインスタンスとPlayerMoverで使用しているCameraManagerのインスタンスが異なるなどをチェックしてみてはどうでしょうか
futonmin

2021/09/09 04:26

今までCameraManager.csを空のオブジェクトに設定し、CameraManagerクラスからMain Cameraをタグで検索していましたが、Main Cameraに直接CameraManager.csをつけ、そのオブジェクトをPlayerMoverクラスにオブジェクトごと情報を持ってくることで一応解決しました。 本当は直接オブジェクトを設定するやり方はやりたくないですが今回はこのやり方しか正解が分からないので解決とさせていただきます。 ありがとうございました。 追記しておきます。
guest

回答1

0

自己解決

結局特定のオブジェクトをドラッグ&ドロップせずとも出来たのでこれにて自己解決とさせていただきます。

C#

1 public class PlayerMover : BasePlayerComponent 2 { 3 private PlayerPrameter _playerPrameter; 4 5 private GameObject _mainCamera; 6 private CameraManager _cameraManager; 7 8 private float _moveSpeed; 9 private float _rotSpeed; 10 11 protected override void OnStart() 12 { 13 base.OnStart(); 14 15 _playerPrameter = GetComponent<PlayerPrameter>(); 16 17// ここでCameraManager.csをアタッチしたオブジェクトを検索 18 _mainCamera = GameObject.Find("Main Camera"); 19 _cameraManager = _mainCamera.GetComponent<CameraManager>(); 20 21 _moveSpeed = _playerPrameter.MoveSpeed; 22 _rotSpeed = _playerPrameter.RotSpeed; 23 } 24 25 // プレイヤー移動 26 public void PlayerMove(float h, float v) 27 { 28 Vector3 velocity = Vector3.zero; 29 float speedExe = _moveSpeed * Time.deltaTime; 30 31 if (v > 0) 32 { 33 velocity.z -= 1; 34 } 35 if (v < 0) 36 { 37 velocity.z += 1; 38 } 39 if (h > 0) 40 { 41 velocity.x -= 1; 42 } 43 if (h < 0) 44 { 45 velocity.x += 1; 46 } 47 48 velocity = velocity.normalized * speedExe; 49 50 if (velocity.magnitude > 0) 51 { 52 transform.rotation = Quaternion.Slerp(transform.rotation, 53 Quaternion.LookRotation(_cameraManager.HRotation * -velocity), 54 _rotSpeed); 55 56 // プレイヤーの位置(transform.position)の更新 57 // カメラの水平回転(refCamera.hRotation)で回した移動方向(velocity)を足し込む 58 transform.position += _cameraManager.HRotation * -velocity; 59 } 60 } 61 }

投稿2021/09/09 04:48

futonmin

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問