Script
Script Player, UI Score, Main Menu Scene, UI Gameover, UI PauseMenu
This commit is contained in:
commit
d4fe831535
|
@ -0,0 +1,60 @@
|
|||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class GameController : MonoBehaviour
|
||||
{
|
||||
public static int playerScore = 0;
|
||||
public static int botScore = 0;
|
||||
|
||||
public Text playerScoreText;
|
||||
public Text botScoreText;
|
||||
|
||||
private string lastHitter;
|
||||
|
||||
void Start()
|
||||
{
|
||||
UpdateScoreUI();
|
||||
}
|
||||
|
||||
public void UpdateScoreUI()
|
||||
{
|
||||
playerScoreText.text = playerScore.ToString();
|
||||
botScoreText.text = botScore.ToString();
|
||||
}
|
||||
|
||||
public void AddScore(string hitter, int points)
|
||||
{
|
||||
if (hitter == "Player")
|
||||
{
|
||||
playerScore += points;
|
||||
}
|
||||
else if (hitter == "Bot")
|
||||
{
|
||||
botScore += points;
|
||||
}
|
||||
|
||||
UpdateScoreUI();
|
||||
}
|
||||
|
||||
public void SetLastHitter(string hitter)
|
||||
{
|
||||
lastHitter = hitter;
|
||||
}
|
||||
|
||||
public bool LastHitterEquals(string hitter)
|
||||
{
|
||||
return lastHitter == hitter;
|
||||
}
|
||||
|
||||
public void ResetBall(Bola bola)
|
||||
{
|
||||
bola.ResetBola();
|
||||
}
|
||||
|
||||
public void ResetScores()
|
||||
{
|
||||
playerScore = 0;
|
||||
botScore = 0;
|
||||
UpdateScoreUI();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,204 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using UnityEngine;
|
||||
|
||||
public class GerakanRaket : MonoBehaviour
|
||||
{
|
||||
// Variabel untuk Gyro
|
||||
SerialPort stream = new SerialPort("COM6", 9600);
|
||||
public string strReceived;
|
||||
public string[] strData = new string[4];
|
||||
public string[] strData_received = new string[4];
|
||||
public float qw, qx, qy, qz;
|
||||
|
||||
// Variabel untuk Gerakan Raket
|
||||
public Transform aimTarget;
|
||||
public float horizontalSpeed = 0.5f;
|
||||
public float verticalSpeed = 0.5f;
|
||||
public float aimSpeed = 1.0f;
|
||||
public AudioClip hitSoundClip;
|
||||
|
||||
private float initialHeight;
|
||||
private Vector3 initialPosition;
|
||||
|
||||
private bool ballMoving = false;
|
||||
|
||||
void Start()
|
||||
{
|
||||
InitializeSerialPort();
|
||||
initialHeight = transform.position.y;
|
||||
initialPosition = transform.position;
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.R))
|
||||
{
|
||||
ResetPlayerPosition();
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (stream.IsOpen && stream.BytesToRead > 0)
|
||||
{
|
||||
strReceived = stream.ReadLine();
|
||||
strData = strReceived.Split(',');
|
||||
if (strData.Length == 4)
|
||||
{
|
||||
ProcessGyroData();
|
||||
if (ballMoving) Move();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogError("Error reading from serial port: " + ex.Message);
|
||||
ReconnectSerialPort();
|
||||
}
|
||||
}
|
||||
|
||||
void ProcessGyroData()
|
||||
{
|
||||
strData_received[0] = strData[0];
|
||||
strData_received[1] = strData[1];
|
||||
strData_received[2] = strData[2];
|
||||
strData_received[3] = strData[3];
|
||||
|
||||
qw = float.Parse(strData_received[0]);
|
||||
qx = float.Parse(strData_received[1]);
|
||||
qy = float.Parse(strData_received[2]);
|
||||
qz = float.Parse(strData_received[3]);
|
||||
|
||||
transform.rotation = new Quaternion(-qy, -qz, qx, qw);
|
||||
}
|
||||
|
||||
void Move()
|
||||
{
|
||||
MoveHorizontal();
|
||||
MoveVertical();
|
||||
MoveAimTarget();
|
||||
}
|
||||
|
||||
void MoveHorizontal()
|
||||
{
|
||||
float horizontalMovement = -qx * horizontalSpeed * Time.deltaTime;
|
||||
Vector3 newPosition = transform.position;
|
||||
newPosition.x += horizontalMovement;
|
||||
newPosition.x = Mathf.Clamp(newPosition.x, -3f, 4.6f);
|
||||
transform.position = newPosition;
|
||||
}
|
||||
|
||||
void MoveVertical()
|
||||
{
|
||||
float verticalMovement = -qy * verticalSpeed * Time.deltaTime;
|
||||
Vector3 newPosition = transform.position;
|
||||
newPosition.z += verticalMovement;
|
||||
newPosition.z = Mathf.Clamp(newPosition.z, -6.5f, 1.6f);
|
||||
transform.position = newPosition;
|
||||
}
|
||||
|
||||
void MoveAimTarget()
|
||||
{
|
||||
float aimHorizontalMovement = qz * aimSpeed * Time.deltaTime;
|
||||
Vector3 aimTargetPosition = aimTarget.position;
|
||||
aimTargetPosition.x += aimHorizontalMovement;
|
||||
aimTarget.position = aimTargetPosition;
|
||||
}
|
||||
|
||||
private void OnTriggerEnter(Collider other)
|
||||
{
|
||||
if (other.CompareTag("Bola"))
|
||||
{
|
||||
HandleBallCollision(other);
|
||||
}
|
||||
}
|
||||
|
||||
void HandleBallCollision(Collider ballCollider)
|
||||
{
|
||||
ballMoving = true;
|
||||
Vector3 dir = aimTarget.position - ballCollider.transform.position;
|
||||
Rigidbody bolaRigidbody = ballCollider.GetComponent<Rigidbody>();
|
||||
|
||||
if (!bolaRigidbody.useGravity)
|
||||
{
|
||||
bolaRigidbody.useGravity = true;
|
||||
}
|
||||
|
||||
float horizontalMovementDirection = -qz;
|
||||
if (horizontalMovementDirection > 10)
|
||||
{
|
||||
bolaRigidbody.velocity = dir.normalized * 7 + new Vector3(1, 5, 1);
|
||||
}
|
||||
else if (horizontalMovementDirection < -10)
|
||||
{
|
||||
bolaRigidbody.velocity = dir.normalized * 7 + new Vector3(-1, 5, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
float verticalMovementDirection = -qy;
|
||||
if (verticalMovementDirection > 0)
|
||||
{
|
||||
bolaRigidbody.velocity = dir.normalized * 7 + new Vector3(0, 5, 2);
|
||||
}
|
||||
else if (verticalMovementDirection < 0)
|
||||
{
|
||||
bolaRigidbody.velocity = dir.normalized * 7 + new Vector3(0, 7, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
bolaRigidbody.velocity = dir.normalized * 7 + new Vector3(0, 6, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (hitSoundClip != null)
|
||||
{
|
||||
AudioSource.PlayClipAtPoint(hitSoundClip, transform.position);
|
||||
}
|
||||
}
|
||||
|
||||
public void ResetPlayerPosition()
|
||||
{
|
||||
Debug.Log("Resetting Player Position");
|
||||
transform.position = initialPosition;
|
||||
ballMoving = false;
|
||||
}
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
if (stream != null && stream.IsOpen)
|
||||
{
|
||||
stream.Close();
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeSerialPort()
|
||||
{
|
||||
try
|
||||
{
|
||||
stream.Open();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogError("Error opening serial port: " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
void ReconnectSerialPort()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (stream != null && stream.IsOpen)
|
||||
{
|
||||
stream.Close();
|
||||
}
|
||||
stream.Open();
|
||||
Debug.Log("Serial port reconnected successfully.");
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogError("Error reconnecting serial port: " + ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
public class MainMenu : MonoBehaviour
|
||||
{
|
||||
public void Play()
|
||||
{
|
||||
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
|
||||
}
|
||||
public void Quit()
|
||||
{
|
||||
Application.Quit();
|
||||
Debug.Log("Player sudah keluar");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
public class OverMenu : MonoBehaviour
|
||||
{
|
||||
public GameObject gameOverPanel;
|
||||
public Text resultText;
|
||||
|
||||
public GameController gameController;
|
||||
|
||||
private bool gameOver = false;
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (!gameOver && gameController != null && (GameController.playerScore >= 11 || GameController.botScore >= 11))
|
||||
{
|
||||
gameOver = true;
|
||||
Time.timeScale = 0;
|
||||
|
||||
gameOverPanel.SetActive(true);
|
||||
|
||||
if (GameController.playerScore >= 11)
|
||||
{
|
||||
resultText.text = "You Win!";
|
||||
}
|
||||
else
|
||||
{
|
||||
resultText.text = "You Lose!";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void RestartGame()
|
||||
{
|
||||
// Kembalikan skor ke nilai awal jika ada
|
||||
if (gameController != null)
|
||||
{
|
||||
gameController.ResetScores();
|
||||
}
|
||||
|
||||
ResetMainScene();
|
||||
|
||||
// Kembalikan waktu permainan ke normal
|
||||
Time.timeScale = 1;
|
||||
|
||||
// Muat ulang level saat ini
|
||||
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
|
||||
}
|
||||
|
||||
public void QuitGame()
|
||||
{
|
||||
// Kembalikan skor ke nilai awal jika ada
|
||||
if (gameController != null)
|
||||
{
|
||||
gameController.ResetScores();
|
||||
}
|
||||
|
||||
ResetMainScene();
|
||||
|
||||
// Kembalikan waktu permainan ke normal
|
||||
Time.timeScale = 1;
|
||||
|
||||
// Kembali ke menu utama (biasanya level sebelumnya)
|
||||
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);
|
||||
}
|
||||
|
||||
private void ResetMainScene()
|
||||
{
|
||||
// Reset posisi objek player jika ada
|
||||
GameObject player = GameObject.FindWithTag("Player");
|
||||
if (player != null)
|
||||
{
|
||||
player.transform.position = Vector3.zero;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class PauseMenu : MonoBehaviour
|
||||
{
|
||||
bool paused = false;
|
||||
public GameObject PauseMenuUI;
|
||||
public GameController gameController;
|
||||
public Slider horizontalMoveSlider;
|
||||
public Slider verticalMoveSlider;
|
||||
public GerakanRaket gerakanRaket;
|
||||
|
||||
void Start()
|
||||
{
|
||||
LoadSettings();
|
||||
}
|
||||
|
||||
void LoadSettings()
|
||||
{
|
||||
|
||||
float horizontalSpeed = PlayerPrefs.GetFloat("HorizontalSpeed", 1f);
|
||||
horizontalMoveSlider.value = horizontalSpeed;
|
||||
gerakanRaket.horizontalSpeed = horizontalSpeed;
|
||||
|
||||
|
||||
float verticalSpeed = PlayerPrefs.GetFloat("VerticalSpeed", 1f);
|
||||
verticalMoveSlider.value = verticalSpeed;
|
||||
gerakanRaket.verticalSpeed = verticalSpeed;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Escape))
|
||||
{
|
||||
pauseGame();
|
||||
}
|
||||
}
|
||||
|
||||
public void pauseGame()
|
||||
{
|
||||
if (paused)
|
||||
{
|
||||
Time.timeScale = 1;
|
||||
paused = false;
|
||||
PauseMenuUI.SetActive(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
Time.timeScale = 0;
|
||||
paused = true;
|
||||
PauseMenuUI.SetActive(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void RestartGame()
|
||||
{
|
||||
if (gameController != null)
|
||||
{
|
||||
gameController.ResetScores();
|
||||
}
|
||||
|
||||
ResetMainScene();
|
||||
Time.timeScale = 1;
|
||||
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
|
||||
}
|
||||
|
||||
public void QuitGame()
|
||||
{
|
||||
if (gameController != null)
|
||||
{
|
||||
gameController.ResetScores();
|
||||
}
|
||||
|
||||
ResetMainScene();
|
||||
Time.timeScale = 1;
|
||||
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);
|
||||
}
|
||||
|
||||
private void ResetMainScene()
|
||||
{
|
||||
GameObject player = GameObject.FindWithTag("Player");
|
||||
if (player != null)
|
||||
{
|
||||
player.transform.position = Vector3.zero;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateHorizontalMove(float value)
|
||||
{
|
||||
gerakanRaket.horizontalSpeed = value;
|
||||
PlayerPrefs.SetFloat("HorizontalSpeed", value);
|
||||
}
|
||||
|
||||
public void UpdateVerticalMove(float value)
|
||||
{
|
||||
gerakanRaket.verticalSpeed = value;
|
||||
PlayerPrefs.SetFloat("VerticalSpeed", value);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue