【问题标题】:How to change player speed with public float from another script如何使用来自另一个脚本的公共浮动来更改播放器速度
【发布时间】:2018-12-13 05:24:50
【问题描述】:

嘿,当我的玩家与物体碰撞时,我正在尝试更改浮动。我尝试了很多参考方法,但在尝试调试时只得到了 null 到目前为止我想出了这个。我想获取包含播放器脚本的游戏对象,这意味着播放器,并且在我想获取组件脚本 tankmovement 以更改其中的变量之后。

在 powerups 脚本第 79 行重置函数 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);
        }



    }

【问题讨论】:

  • 可能是初始化错误,能给我们看看main()函数吗?当您设置 [...].m_speed = 20f 时会出现问题,对吗?
  • 我的对象引用未设置为对象实例,我将坦克预制件拖到游戏对象上。我想提高玩家速度正常是 12f 我想要 20f 碰撞时。
  • 应该有两种可能:或者你没有调用足够的实例或者你没有初始化对象。这就是我要求查看主代码的原因,这样我们就可以看到您在哪里声明了实例以及您在哪里尝试分配值。
  • 我添加了我的脚本,但我没有得到它,如果我得到脚本的方式不好,但只有当我再次将其更改为静态时仍然无法按预期工作,但这是我发现的不好的做法
  • @J.Francis 在为统一引擎编码时,没有main 函数。

标签: c# unity3d


【解决方案1】:

由于你需要访问的TankMovement组件附加到了与电源碰撞的GameObject,你可以通过other.gameObject.GetComponent&lt;TankMovement&gt;()获取你需要更改的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
        }    
    }
}

【讨论】:

  • 如果我要重置更新中的提升,布尔值变为假,那么你将如何引用这个我发布了我在编辑中所做的事情,我得到一个空引用错误
  • 请编辑您的问题以显示您在哪一行出现空引用错误,以便我更好地了解问题所在。
  • 已编辑,我只是​​感到困惑,因为我的 Tank 已实例化,这意味着它会生成,所以它从一开始就不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多