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

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

ただいまの
回答率

88.59%

unityちゃんを動かす向きを変えたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 635

nk598xv

score 15

Standard Assetsを使って人型3Dモデルを動かす向きを変えたいのですがうまくいきません。
Standard AssetsのThirdPersonUserControl ではカメラの向きを取得してその方向へ3Dモデルを動かすスクリプトが組まれています。カメラの向きを変えながらまっすぐ動かしたいためPoleというオブジェクトを作り、cameraの代わりに向きを取得させたいのですが The name 'Pole' does not exist in the current contextというエラーが出てきてしまい取得出来ません。しかしtestというオブジェクトを作成してpoleの情報を取得させるとエラーを吐かず取得出来ます。どのようにしたらPoleの向きへ動かすことが出来ますか?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pole : MonoBehaviour
{
        public static Pole m_instance;
        //public static Pole pole_instance;
        // Start is called before the first frame update
        private Vector3 poleplayer_position;
        private Vector3 poleplayer_forward;
        private Vector3 poleplayer_rotate;
        void Start()
        {
                m_instance=this;
                //pole_instance=this;

        }

        // Update is called once per frame
        void Update()
        {
                poleplayer_position=ThirdPersonUserControl.m_instance.transform.position;//自機のポジション
                poleplayer_position=test.m_instance.transform.position;
                //Debug.Log(poleplayer_position);
        }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
        // Start is called before the first frame update
        public static test m_instance;
        private Vector3 poleplayer_position;
        void Start()
        {
                m_instance=this;
        }

        // Update is called once per frame
        void Update()
        {
                poleplayer_position=Pole.m_instance.transform.position;
                Debug.Log(poleplayer_position);
        }
}

Update()直下にpoleの情報を取得するスクリプトを書いています

using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
using System.Collections;
using System.Collections.Generic;

namespace UnityStandardAssets.Characters.ThirdPerson
{
[RequireComponent(typeof (ThirdPersonCharacter))]
public class ThirdPersonUserControl : MonoBehaviour
{
        private ThirdPersonCharacter m_Character; // A reference to the ThirdPersonCharacter on the object
        private Transform m_Cam;                  // A reference to the main camera in the scenes transform
        private Vector3 m_CamForward;             // The current forward direction of the camera
        private Vector3 m_Move;
        private bool m_Jump;                      // the world-relative desired move direction, calculated from the camForward and user input.
        public static ThirdPersonUserControl m_instance;

        //private Transform pole_trans;
        private Vector3 pole_position;

        private void Start()
        {
                m_instance=this;
                //pole_trans=Pole.pole_instance.transform;
                //pole_position=Pole.m_instance.transform.position;
                //if(Pole.m_instance==null) {Debug.Log("Pole null");}

                // get the transform of the main camera
                if (Camera.main != null)
                {
                        m_Cam = Camera.main.transform;
                }
                else
                {
                        Debug.LogWarning(
                                "Warning: no main camera found. Third person character needs a Camera tagged \"MainCamera\", for camera-relative controls.", gameObject);
                        // we use self-relative controls in this case, which probably isn't what the user wants, but hey, we warned them!
                }
                // get the third person character ( this should never be null due to require component )
                m_Character = GetComponent<ThirdPersonCharacter>();
        }


        private void Update()
        {
                pole_position=Pole.m_instance.transform;
                if (!m_Jump)
                {
                        m_Jump = CrossPlatformInputManager.GetButtonDown("Jump");
                }
        }


        // Fixed update is called in sync with physics
        private void FixedUpdate()
        {
                // read inputs
                float h = CrossPlatformInputManager.GetAxis("Horizontal");//十字キー取得
                //float v = CrossPlatformInputManager.GetAxis("Vertical");
                float v=1f;
                bool crouch = Input.GetKey(KeyCode.C);
                // calculate move direction to pass to character
                if (m_Cam != null)
                {
                        // calculate camera relative direction to move:
                        m_CamForward = Vector3.Scale(m_Cam.forward, new Vector3(1, 0, 1)).normalized;
                        m_Move = v*m_CamForward + h*m_Cam.right;
                }
                else
                {
                        // we use world-relative directions in the case of no main camera
                        m_Move = v*Vector3.forward + h*Vector3.right;
                }
#if !MOBILE_INPUT
                // walk speed multiplier
                if (Input.GetKey(KeyCode.LeftShift)) m_Move *= 0.5f;
#endif

                // pass all parameters to the character control script
                //Debug.Log(h+":"+v);
                m_Character.Move(m_Move, crouch, m_Jump);
                m_Jump = false;
        }
}
}


スクリプトを置く場所が原因かと思い、SSも上げておきます
イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

問題点・適切でない点

Update()直下の文

pole_position=Pole.m_instance.transform;


に"Pole"とありますが、"Pole"はスクリプト内で宣言されていません。
原則クラス参照は同じコード内で記述しますので↓

解決策

ThirdPersonUserControlクラス内に

public GameObject Pole;


を記述して、エディターから参照を渡してあげるとできると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/10 08:44

    回答ありがとうございます。Poleの向きを使って動かすことが出来ました。
    しかしなぜtestとPoleは同じように宣言して参照せずとも情報を取得出来たのでしょうか?

    キャンセル

  • 2019/10/11 22:58

    スクリプトThirdPersonUserControl内に
    "namespace UnityStandardAssets.Characters.ThirdPerson{"
    という文章が記述されています。
    つまりThirdPersonUserControlクラスはUnityStandardAssets.Characters.ThirdPerson名前空間に記述されており「全く別の位置」に書かれていたのでPoleクラスを見つけることができなかったわけです。
    詳しいことはこちらを参照>>https://dkrevel.com/makegame-beginner/namespace/

    蛇足ですがこの"namespace...ThirdPerson{"という文を消すと正常に動作するように思えるかもしれませんが多分エラーを出されるのでやめた方がいいです。

    キャンセル

  • 2019/10/16 09:43

    ありがとうございました

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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