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

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

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

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

Unity

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

Q&A

解決済

1回答

2131閲覧

Unity で他のスクリプトの変数を使いたい

Antlia

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2021/07/19 11:24

編集2021/07/21 09:12

前提・実現したいこと

Unityで他のオブジェクトを追従するプログラムを作っています。
やりたいことのイメージとしてはGameObjectにあるCylinderのyの回転を基にGameObjectのCylinder(1)をやや時間差で回転させることです。
また、現在Start関数を用いていますが本当は毎フレームごとに操作をしたいと考えています。
Follow.csでコメントアウトしているような自作関数を用いるとDebug.Logも何も表示されなくなります。(エラーは出ていません)
こちらについても原因がわからないので何かご存じの方がいましたら教えてください。

発生している問題・エラーメッセージ

エラーは出ていませんが変数の値を取得できていません。
現在実装しているコードを記載します。

該当のソースコード

基準
CyrinderRotation.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class CyrinderRotation : MonoBehaviour { public float old_angle = 0; public string GetServoAngle() { var rb = GetComponent<Rigidbody>(); //gameObject.transform.localEulerAngles;//オブジェクトの回転座標取得 //return $"{ConvertPitch(transform.localEulerAngles.x)},{ConvertYaw(transform.localEulerAngles.y)}"; //transform.rigidbody.constraints = RigidbodyConstraints.FreezePosition; old_angle = transform.localEulerAngles.y; //y方向の回転取得、この回転を基にもう一つのオブジェクトを操作 //Debug.Log(old_angle); //ログ確認 return $"{transform.localEulerAngles.y}"; }

2つ目のオブジェクト(1つめを基に回転する方)
Follow.cs
CyrinderRotate.csのGetServoAngle関数のold_amgle(変数)をvirtual_y_angleに代入して制御をしたい
Follow.csのインスペクターにScript、GameObject、CyrinderRotationが存在している
GameObjectにCylinderをアタッチ

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class Follow : MonoBehaviour { public GameObject GameObject; public CyrinderRotation cyrinderRotation; GameObject Cylinder; CyrinderRotation script; float virtual_y_angle = 0; //基となる円柱の角度 float sub_angle = 0; //追従する円柱の角度 float Difference = 0; //両方の角度差 float new_angle = 0; //追従する円柱に入力する角度 //追従する円柱の角度を決める関数、Start関数で動作確認しているが毎フレーム動作させたい //public string kansuu() //public void kansuu() //void update() void Start() { var rb = GetComponent<Rigidbody>(); Cylinder = GameObject.Find("Cylinder"); script = GameObject.GetComponent<CyrinderRotation>(); //script = GameObject.Cylinder.GetComponent<CyrinderRotation>(); virtual_y_angle = script.old_angle; //基本となる円柱の角度(old_angle)をvirtual_y_angleに代入 sub_angle = transform.localEulerAngles.y; Debug.Log(sub_angle); Debug.Log(virtual_y_angle); // /* //ここで2つめの円柱に代入する角度を計算 if (sub_angle > virtual_y_angle) { Difference = sub_angle - virtual_y_angle; new_angle = sub_angle - 0.2 * Difference; transform.rotation = Quaternion.Euler(new Vector3(0, new_angle, 0)); //ここで角度代入 } if(virtual_y_angle > sub_angle) { Difference = virtual_y_angle - sub_angle; new_angle = sub_angle + 0.2 * Difference; transform.rotation = Quaternion.Euler(new Vector3(0, new_angle, 0)); //ここで角度代入 } Debug.Log(Difference); Debug.Log(new_angle);   } }

試したこと

ネットの記事を参考に書いてみましたがうまくいっていません。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

Zuishin

2021/07/20 06:10

GetServoAngle を呼んでいないから。
Antlia

2021/07/20 07:46

Zuishinさん cyrinderRotation.GetServoAngle(); を追加することで動くようになりました。 ありがとうございます。
Zuishin

2021/07/20 08:28

自己解決してください。
Zuishin

2021/07/21 09:14

自己解決というのは、自分で回答してそれをベストアンサーに選ぶことです。 teratail の質問と回答は資料になるので、赤の他人が見て同じ問題を解決できるよう回答してください。
guest

回答1

0

自己解決

Follow.cs内でCyrinderRitation.csで作成したGetServoAngle関数を呼んでいないことが原因であるとのご指摘を頂きました。

追従する方のオブジェクトのFollow.cs内を下記のように変更することで動作するようになりました。

またvoid start()からvoid Update()に変更することで連続的に変化させることができるようになりました。

以下変更したコードになります。

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class Follow : MonoBehaviour { public GameObject GameObject; CyrinderRotation cyrinderRotation; float virtual_y_angle = 0; //1つめの円柱の角度 float sub_angle = 0; //2つめの円柱の角度 float difference = 0; //両方の角度差 float new_angle = 0; //2つめの円柱の新しい角度 float K = 0.01f; void Update() { cyrinderRotation = GameObject.GetComponent<CyrinderRotation>(); string data; //double data2; float angle2; //angle2 = cyrinderRotation.old_angle; data = cyrinderRotation.GetServoAngle(); //関数(GetServoAngle()の返り値)の取得 double data2 = Convert.ToDouble(data); //取得した値の型の変換 angle2 = (float)data2; //angle2 = CyrinderRotation.instance.old_angle; //Debug.Log(angle2); virtual_y_angle = angle2; //1つめの円柱の角度(old_angle)をvirtual_y_angleに代入 sub_angle = transform.localEulerAngles.y; Debug.Log(sub_angle); Debug.Log(virtual_y_angle); // /* //ここで2つめの円柱に代入する角度を計算する if (sub_angle > virtual_y_angle) { difference = sub_angle - virtual_y_angle; new_angle = sub_angle - K * difference; transform.rotation = Quaternion.Euler(new Vector3(0, new_angle, 0)); //ここで角度代入 } if (virtual_y_angle > sub_angle) { difference = virtual_y_angle - sub_angle; new_angle = sub_angle + K * difference; transform.rotation = Quaternion.Euler(new Vector3(0, new_angle, 0)); //ここで角度代入 } Debug.Log(control_angle); Debug.Log(new_angle); } }

投稿2021/07/21 09:15

編集2021/07/22 01:28
Antlia

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問