-
-
Save StevenPhoton/182588e9a18f93cfea12ec31111d8c71 to your computer and use it in GitHub Desktop.
VR Photon Tanks 程式參考
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using Rewired; | |
namespace Complete | |
{ | |
public class TankMovement : Photon.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 = 8f; // How fast the tank moves forward and back. | |
public float m_TurnSpeed = 120f; // 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 ParticleSystem[] m_particleSystems; // References to all the particles systems used by the Tanks | |
private Player player; | |
private bool isVRMode = true; | |
private void Awake () | |
{ | |
m_Rigidbody = GetComponent<Rigidbody> (); | |
if( photonView.isMine ) { | |
player = ReInput.players.GetPlayer(0); | |
} | |
isVRMode = true; | |
} | |
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; | |
// We grab all the Particle systems child of that Tank to be able to Stop/Play them on Deactivate/Activate | |
// It is needed because we move the Tank when spawning it, and if the Particle System is playing while we do that | |
// it "think" it move from (0,0,0) to the spawn point, creating a huge trail of smoke | |
m_particleSystems = GetComponentsInChildren<ParticleSystem>(); | |
for (int i = 0; i < m_particleSystems.Length; ++i) | |
{ | |
m_particleSystems[i].Play(); | |
} | |
} | |
private void OnDisable () | |
{ | |
// When the tank is turned off, set it to kinematic so it stops moving. | |
m_Rigidbody.isKinematic = true; | |
// Stop all particle system so it "reset" it's position to the actual one instead of thinking we moved when spawning | |
for(int i = 0; i < m_particleSystems.Length; ++i) | |
{ | |
m_particleSystems[i].Stop(); | |
} | |
} | |
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 () | |
{ | |
if( ! photonView.isMine ) { | |
return; | |
} | |
if( player.GetButtonDown ("SwitchView") ) | |
{ | |
if( isVRMode == false ) { | |
GameObject goCamera = GameObject.FindGameObjectWithTag("MainCamera"); | |
goCamera.transform.SetParent( transform ); | |
goCamera.transform.localPosition = new Vector3( -0.307f, 3.204f, -6.168f); | |
goCamera.transform.localRotation = Quaternion.identity; | |
isVRMode = true; | |
// GvrViewer gvrView = GameObject.Find("GvrViewerMain").GetComponent<GvrViewer>(); | |
// gvrView.VRModeEnabled = true; | |
} else { | |
GameObject goCamera = GameObject.FindGameObjectWithTag("MainCamera"); | |
goCamera.transform.parent = null; | |
goCamera.transform.position = new Vector3( -20.376f, 17f, -11.2f); | |
goCamera.transform.rotation = Quaternion.Euler( new Vector3(25f, 44f, 0f) ); | |
isVRMode = false; | |
// GvrViewer gvrView = GameObject.Find("GvrViewerMain").GetComponent<GvrViewer>(); | |
// gvrView.VRModeEnabled = false; | |
} | |
} | |
// Store the value of both input axes. | |
// m_MovementInputValue = Input.GetAxis (m_MovementAxisName); | |
// m_TurnInputValue = Input.GetAxis (m_TurnAxisName); | |
// 使用 ReWired 的 Input 設定值, get input by name or action id | |
// player = ReInput.players.GetPlayer(0); | |
m_MovementInputValue = player.GetAxis("Move Horizontal (F+B)"); | |
m_TurnInputValue = player.GetAxis("Move Horizontal (L+R)"); | |
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 () | |
{ | |
if( ! photonView.isMine ) { | |
return; | |
} | |
// 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); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment