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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

2736閲覧

[Unity]ステートから抜けた時に変数の中身を変更したいです

kosho206

総合スコア41

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/06/20 00:42

編集2020/06/21 01:27

特定のステートから抜けたタイミングで、シーン内のオブジェクトにアタッチされたスクリプトの変数を変更したいなと思い、StateMachineBehaviorで、以下のスクリプトを書きました。

public class UntiburiBehaviour : StateMachineBehaviour { [SerializeField] GameObject Unkoman; UnkomanAction UnkomanAction; void Start() { UnkomanAction = Unkoman.GetComponent<UnkomanAction>(); } override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { animator.SetBool("UntiburiFlag", true); } override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { animator.SetBool("UntiburiFlag", false); UnkomanAction.UnkoSet = 1; } }

このコードの[SerializeField]でシーン内のオブジェクトを取得したかったのですが、インスペクターでシーン内のオブジェクトを入れることができませんでした。

StateMachineBehaviourでは、MonoBehaviourでいつも書いているようなコードは使うことはできないのですか?
特定のステートから抜けたタイミングで、シーン内のオブジェクトにアタッチされたスクリプトの変数を変更するには、どのような書き方をすればできますか?

※追記 回答をいただいた後に書いたStateMachineBehaviourのコードです。
UnkoSetはpublic変数です

override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { animator.SetBool("UntiburiFlag", true); animator.gameObject.GetComponent<UnkomanAnim>().UnkoSet = 1; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

StateMachineBehaviourはあくまでAnimation Controllerに紐づき特定のシーンで使われるものではない為シーン上のオブジェクトを直接アタッチすることはできません

ただOnStateEnter/Exitで渡されるAnimator経由でAnimation ControllerがアタッチされているGameObjectを取得することはできるのでAnimator経由でアクセスするのが良いと思います

// アタッチされているコンポーネントを取得したり var hogeController = animator.GetComponent<HogeController>(); // ゲームオブジェクトを取得したり var ownerObject = animator.gameObject;

投稿2020/06/20 07:35

MMashiro

総合スコア2378

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

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

kosho206

2020/06/21 01:37

ありがとうございます。 質問の追記で書いたコードを使うことで、無事変数を変更することができました。 ですが、これだとGetComponentをかなり頻繁に呼ぶことになり、重くならないか心配です。 このコードを使うキャラクターを10人ほど置いて、マルチプレイで対戦するゲームにする予定なので、影響がかなり大きい気がします。 頻繁にGetCompolnentを呼ぶのを防ごうと思い、StateMachinBehaviourのコードにStart関数を書き、その中でGetComponent<Animator>()をやろうとしましたが、エラーが出て使えませんでした。 OnstateEnter/Exix以外の場所で、GetComponentをすることは、どうしてもできないのでしょうか?
MMashiro

2020/06/21 01:49

一番簡単な方法はprivate変数でGetComponentした内容を保持しておくことだと思います。 OnStateEnterでGetComponentした結果を代入しておき、次OnStateEnterが呼ばれた際にはその変数の中身を参照するようにすれば一度のみGetComponentを呼ぶようにできるかと思います。
kosho206

2020/06/21 07:46

確かにそうですね。ありがとうございます。 この方法なら何度もGetComponentを呼ばずに上手く動きそうです。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問