Как изменить скорость игрока с помощью публичного поплавка из другого скрипта - PullRequest
0 голосов
/ 12 декабря 2018

Эй, я пытаюсь сменить поплавок, когда мой игрок сталкивается с объектом.Я пробовал много способов ссылки, но потерял значение только при попытке отладки, я до сих пор придумал это.Я хочу получить игровой объект, который содержит сценарий игрока, означающий игрока, и после того, как я хочу получить перемещение сценария компонента, чтобы изменить переменную в нем.

Получение ошибки нулевой ссылки в строке 79 сценария powerups для сброса функции сбросаTank=GameObject.FindWithTag("Player")

        using System.Collections.Generic;
    using UnityEngine;
    public class PowerUp : MonoBehaviour {

        public bool boosting = false;
        public GameObject effect;
        public AudioSource clip;
        public GameObject Tank;
        private void Start()
        {
           Tank  = GameObject.Find("Tank(Clone)");
          TankMovement script = GetComponent<TankMovement>();
        }

        private void OnTriggerEnter(Collider other)
        {
            if (other.gameObject.CompareTag("Player"))
            {
                if (!boosting)
                {
                    clip.Play();
                    GameObject explosion = Instantiate(effect, transform.position, transform.rotation);
                    Destroy(explosion, 2);
                    GetComponent<MeshRenderer>().enabled = false;
                    GetComponent<Collider>().enabled = false;
                    Tank.GetComponent<TankMovement>().m_Speed = 20f;
                    //TankMovement.m_Speed = 20f;
                    boosting = true;
                    Debug.Log(boosting);
                    StartCoroutine(coolDown());
                }


            }
private IEnumerator coolDown()
    {
        if (boosting == true)
        {
            yield return new WaitForSeconds(4);
            {
                boosting = false;
                GetComponent<MeshRenderer>().enabled = true;
                GetComponent<Collider>().enabled = true;
                Debug.Log(boosting);
               // Destroy(gameObject);

            }
        }
    }

    void reset()
    {
        //TankMovement.m_Speed = 12f;
        TankMovement collidedMovement = Tank.gameObject.GetComponent<TankMovement>();
        collidedMovement.m_Speed = 12f;
        //TankMovement1.m_Speed1 = 12f;
    }

        }
        }

Попытка вызвать мой поплавок m_Speed ​​в скрипте игрока, чтобы повысить скорость моего игрока, когда он сталкивается с ним.Как получить правильную ссылку, так как мой игрок - сборный.

Сценарий танка

  using UnityEngine;

    public class TankMovement : MonoBehaviour
    {
        public int m_PlayerNumber = 1;         
        public float m_Speed = 12f;            
        public float m_TurnSpeed = 180f;       
        public AudioSource m_MovementAudio;    
        public AudioClip m_EngineIdling;       
        public AudioClip m_EngineDriving;      
        public float m_PitchRange = 0.2f;


        private string m_MovementAxisName;     
        private string m_TurnAxisName;         
        private Rigidbody m_Rigidbody;         
        private float m_MovementInputValue;    
        private float m_TurnInputValue;        
        private float m_OriginalPitch;         


        private void Awake()
        {
            m_Rigidbody = GetComponent<Rigidbody>();
        }


        private void OnEnable ()
        {
            m_Rigidbody.isKinematic = false;
            m_MovementInputValue = 0f;
            m_TurnInputValue = 0f;
        }


        private void OnDisable ()
        {
            m_Rigidbody.isKinematic = true;
        }


        private void Start()
        {
            m_MovementAxisName = "Vertical" + m_PlayerNumber;
            m_TurnAxisName = "Horizontal" + m_PlayerNumber;

            m_OriginalPitch = m_MovementAudio.pitch;
        }

        private void Update()
        {
            // Store the player's input and make sure the audio for the engine is playing.
            m_MovementInputValue = Input.GetAxis(m_MovementAxisName);
            m_TurnInputValue = Input.GetAxis(m_TurnAxisName);

            EngineAudio();
        }


        private void EngineAudio()
        {
            // Play the correct audio clip based on whether or not the tank is moving and what audio is currently playing.

            if (Mathf.Abs(m_MovementInputValue) < 0.1f && Mathf.Abs(m_TurnInputValue) < 0.1f)
            {
                if (m_MovementAudio.clip == m_EngineDriving)

                {
                    m_MovementAudio.clip = m_EngineIdling;
                    m_MovementAudio.pitch = Random.Range(m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
                    m_MovementAudio.Play();
                }
            }
            else
            {
                if (m_MovementAudio.clip == m_EngineIdling)

                {
                    m_MovementAudio.clip = m_EngineDriving;
                    m_MovementAudio.pitch = Random.Range(m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
                    m_MovementAudio.Play();
                }
            }
        }


        private void FixedUpdate()
        {
            // Move and turn the tank.
            Move();
            Turn();
        }


        private void Move()
        {
            // Adjust the position of the tank based on the player's input.
            Vector3 movement = transform.forward * m_MovementInputValue * m_Speed * Time.deltaTime;

            m_Rigidbody.MovePosition(m_Rigidbody.position + movement);
        }


        private void Turn()
        {
            // Adjust the rotation of the tank based on the player's input.
            float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;

            Quaternion turnRotation = Quaternion.Euler(0f, turn, 0);

            m_Rigidbody.MoveRotation(m_Rigidbody.rotation * turnRotation);
        }



    }

1 Ответ

0 голосов
/ 12 декабря 2018

Поскольку компонент TankMovement, к которому вам нужно получить доступ, подключен к GameObject, который сталкивается с источником питания, вы можете получить компонент TankMovement, который необходимо изменить, используя other.gameObject.GetComponent<TankMovement>():

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Player"))
    {
        if (!boosting)
        {
            // stuff
            TankMovement collidedMovement = other.gameObject.GetComponent<TankMovement>();
            collidedMovement.m_Speed = 20f;
            // more stuff
        }    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...