qq_37296877 2017-05-15 13:23 采纳率: 61%
浏览 1556

unity的一个获取轴小问题

using UnityEngine;

public class TankMovement : MonoBehaviour
{
public int m_PlayerNumber = 1; // Used to identify which tank belongs to which player. This is set by this tank's manager.
public float m_Speed = 12f; // How fast the tank moves forward and back.
public float m_TurnSpeed = 180f; // How fast the tank turns in degrees per second.
public AudioSource m_MovementAudio; // Reference to the audio source used to play engine sounds. NB: different to the shooting audio source.
public AudioClip m_EngineIdling; // Audio to play when the tank isn't moving.
public AudioClip m_EngineDriving; // Audio to play when the tank is moving.
public float m_PitchRange = 0.2f; // The amount by which the pitch of the engine noises can vary.

private string m_MovementAxisName;          // The name of the input axis for moving forward and back.
private string m_TurnAxisName;              // The name of the input axis for turning.
private Rigidbody m_Rigidbody;              // Reference used to move the tank.
private float m_MovementInputValue;         // The current value of the movement input.
private float m_TurnInputValue;             // The current value of the turn input.
private float m_OriginalPitch;              // The pitch of the audio source at the start of the scene.


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


private void OnEnable ()
{
    // When the tank is turned on, make sure it's not kinematic.
    m_Rigidbody.isKinematic = false;

    // Also reset the input values.
    m_MovementInputValue = 0f;
    m_TurnInputValue = 0f;
}


private void OnDisable ()
{
    // When the tank is turned off, set it to kinematic so it stops moving.
    m_Rigidbody.isKinematic = true;
}


private void Start ()
{
    // The axes names are based on player number.
    m_MovementAxisName = "Vertical" + m_PlayerNumber;
    m_TurnAxisName = "Horizontal" + m_PlayerNumber;

    // Store the original pitch of the audio source.
    m_OriginalPitch = m_MovementAudio.pitch;
}


private void Update ()
{
    // Store the value of both input axes.
    m_MovementInputValue = Input.GetAxis (m_MovementAxisName);
    m_TurnInputValue = Input.GetAxis (m_TurnAxisName);

    EngineAudio ();
}


private void EngineAudio ()
{
    // If there is no input (the tank is stationary)...
    if (Mathf.Abs (m_MovementInputValue) < 0.1f && Mathf.Abs (m_TurnInputValue) < 0.1f)
    {
        // ... and if the audio source is currently playing the driving clip...
        if (m_MovementAudio.clip == m_EngineDriving)
        {
            // ... change the clip to idling and play it.
            m_MovementAudio.clip = m_EngineIdling;
            m_MovementAudio.pitch = Random.Range (m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
            m_MovementAudio.Play ();
        }
    }
    else
    {
        // Otherwise if the tank is moving and if the idling clip is currently playing...
        if (m_MovementAudio.clip == m_EngineIdling)
        {
            // ... change the clip to driving and play.
            m_MovementAudio.clip = m_EngineDriving;
            m_MovementAudio.pitch = Random.Range(m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
            m_MovementAudio.Play();
        }
    }
}


private void FixedUpdate ()
{
    // Adjust the rigidbodies position and orientation in FixedUpdate.
    Move ();
    Turn ();
}


private void Move ()
{
    // Create a vector in the direction the tank is facing with a magnitude based on the input, speed and the time between frames.
    Vector3 movement = transform.forward * m_MovementInputValue * m_Speed * Time.deltaTime;

    // Apply this movement to the rigidbody's position.
    m_Rigidbody.MovePosition(m_Rigidbody.position + movement);
}


private void Turn ()
{
    // Determine the number of degrees to be turned based on the input, speed and time between frames.
    float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;

    // Make this into a rotation in the y axis.
    Quaternion turnRotation = Quaternion.Euler (0f, turn, 0f);

    // Apply this rotation to the rigidbody's rotation.
    m_Rigidbody.MoveRotation (m_Rigidbody.rotation * turnRotation);
}

}

这是官方代码
m_MovementAxisName = "Vertical" + m_PlayerNumber;
m_TurnAxisName = "Horizontal" + m_PlayerNumber;

            这一句怎么分析
            不是GetAxis("Horizontal")吗
            这个怎么也能那么用

            还有最后一句
            怎么用的是乘法,不是应该从初始位置旋转吗?旋转角度不是用的加法吗?
            移动跟旋转的操作方式不一样?
  • 写回答

1条回答 默认 最新

  • devmiao 2017-05-16 03:13
    关注
    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?