Untitled
unknown
plain_text
3 years ago
6.3 kB
11
Indexable
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor.SearchService;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
// this is an alternative Player script, with extras.
[RequireComponent(typeof(Rigidbody))] // This automatically attaches a RIGIDBODY component to anything this script is attached to
public class RollyBallBeta : MonoBehaviour
{
// PUBLIC variables
public float playerSpeed = 15;
public Text scoreText;
public GameObject collectVFX;
public float vfxPlayTime;
// Maybe we need some more variables to track progress...?
public GameObject[] collectibleObjects;
public int targetCollectibles;
public Text collectibleText;
public Text timeTaken;
public GameObject exitDoor;
// PRIVATE variables
Rigidbody rb;
Vector3 moveInput;
int scoreValue;
Vector3 startPos;
int collectedCollectibles;
int maxCollectibles;
int currentTimeTaken;
void Awake()
{
rb = GetComponent<Rigidbody>();
startPos = transform.position;
}
void Start()
{
SetStartValues();
DisplayCollectiblesCount();
StartTimer();
DisplayTimer();
GetMaxCollectibles();
DisplayCollectiblesCount();
}
void Update()
{
GetInputs();
}
void FixedUpdate()
{
DoMovement();
}
#region Collision Scripts
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Collectible"))
{
int newScore = scoreValue + 1;
UpdateCollectibles();
UpdateScoreValue(newScore);
if (collectVFX != null)
{
GameObject VFX = Instantiate(collectVFX, other.transform.position, other.transform.rotation);
StartCoroutine(DestroyVFX(VFX));
}
Destroy(other.gameObject);
}
else if (other.CompareTag("Restart"))
{
//rb.velocity = Vector3.zero;
//transform.position = startPos;
// maybe this would be a better option...?
RestartLevel();
Debug.Log("Restart");
}
// Your Tags here!
else if (other.CompareTag("EndDoor"))
{
LoadNextLevel();
}
else
{
Debug.Log("I hit a " + other.name + " with the tag " + other.tag + " at pos: " + other.transform.position);
}
}
#endregion
void SetStartValues()
{
UpdateScoreValue(0);
// maybe we could setup physics here?
//SetupInitialPhysics();
// Maybe we could do a timer?
//ResetTimer();
//startTimer();
}
void GetInputs()
{
moveInput = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized;
}
void DoMovement()
{
rb.AddForce(moveInput * playerSpeed);
}
#region Score
void UpdateScoreValue(int i)
{
scoreValue = i;
WriteScoreText(i);
}
void WriteScoreText(int i)
{
scoreText.text = i + " points";
}
#endregion
#region Collectibles
void UpdateCollectibles()
{
collectedCollectibles++;
DisplayCollectiblesCount();
}
void GetMaxCollectibles()
{
maxCollectibles = collectibleObjects.Count();
}
void DisplayCollectiblesCount()
{
collectibleText.text = collectedCollectibles.ToString() + " / " + maxCollectibles;
}
void DisplayCollectiblesCount(int collected)
{
collectibleText.text = collected.ToString() + " / " + targetCollectibles.ToString();
}
#endregion
#region Timer
void StartTimer()
{
InvokeRepeating("UpdateTimer", 1f, 1f);
}
void UpdateTimer()
{
currentTimeTaken++;
DisplayTimer();
}
void ResetTimer()
{
currentTimeTaken=0;
DisplayTimer();
}
void StopTimer()
{
CancelInvoke("UpdateTimer");
}
void DisplayTimer()
{
timeTaken.text = currentTimeTaken.ToString();
}
#endregion
IEnumerator DestroyVFX(GameObject vfx)
{
yield return new WaitForSeconds(vfxPlayTime);
Destroy(vfx);
}
void SetupInitialPhysics() // This METHOD will setup various Physics options; they can all be set in the editor, but if you know what you want you can automate it in script.
{
rb.isKinematic = false; // this is not a kinematic rigidbody, we want physics running
rb.detectCollisions = true; // yes please, detect collisions!
rb.useGravity = true; // yes please, use gravity!
rb.interpolation = RigidbodyInterpolation.Interpolate; // smooths out physics movements to better sync with rendering fps
rb.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic; // ContinousSpeculative is more efficient, but may have issues at speed
}
#region Level Loading Scripts
// Methods relating to loading levels.
// This is getting long enough that it might be worth thinking about turning it into a new CLASS...
int GetCurrentSceneIndex()
{
UnityEngine.SceneManagement.Scene scene = SceneManager.GetActiveScene();
int level = scene.buildIndex;
return (level);
}
void LoadPreviousLevel()
{
int prev = GetCurrentSceneIndex();
if (prev<0) { prev = 0; }
SceneManager.LoadScene(prev);
}
void LoadNextLevel()
{
int next = GetCurrentSceneIndex();
next++;
SceneManager.LoadScene(next);
}
void LoadSpecificLevel(int level)
{
SceneManager.LoadScene(level);
}
void RestartLevel()
{
SceneManager.LoadScene(GetCurrentSceneIndex());
}
#endregion
}
Editor is loading...