Tarkoitus on laatia pohja tasohyppelylle jossa hahmo voi pomppia tasolta toiselle.

Luo uusi 2D-projekti.
Tarkoitus on laatia pohja tasohyppelylle jossa hahmo voi pomppia tasolta toiselle.
Tee lattiasta Prefab raahaamalla se Prefabs-kansioosi.
public class PlayerController : MonoBehaviour
{
public float speed;
public float jumpforce;
public float moveInput;
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
speed = 2f;
jumpforce = 2f;
}
void FixedUpdate()
{
// oikea nuoli = 1, vasen nuoli = -1
moveInput = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
}
private bool facingRight = true;
void Flip() {
facingRight = !facingRight;
Vector3 Scaler = transform.localScale;
Scaler.x = Scaler.x * -1;
transform.localScale = Scaler;
}
Flip()-metodia kutsutaan kun hahmo olisi liikkumassa:
void FixedUpdate()
{
// oikea nuoli = 1, vasen nuoli = -1
moveInput = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
if (!facingRight && moveInput > 0) {
// jos ei katsota oikeaan ja painettu oikealle
Flip();
}
else if (facingRight && moveInput < 0) {
// tai jos katsotaan oikealle ja painettu vasemmalle
Flip();
}
}
// onko hahmo maassa?
private bool isGrounded;
// tarkistus onko maa jalkojen kohdalla
public Transform groundCheck;
// tarkistettavan alueen säde
public float checkRadius;
public LayerMask whatIsGround;
void FixedUpdate()
{
isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);
Jos ikoni ei näy niin tarkista Gizmos-alasvetovalikko.


public int extraJumps; private int extraJumpValue = 2;
void Update() {
// jos ollaan maassa niin nollataan hypyt:
if (isGrounded == true) {
extraJumps = extraJumpValue;
}
if (Input.GetKeyDown(KeyCode.UpArrow) && extraJumps > 0) {
rb.velocity = Vector2.up * jumpforce;
extraJumps--;
}
else if (Input.GetKeyDown(KeyCode.UpArrow) && extraJumps == 0 && isGrounded == true) {
rb.velocity = Vector2.up * jumpforce;
}
}
void Start()
{
extraJumps = extraJumpValue;
rb = GetComponent<Rigidbody2D>();
}
Jotta pelaaja ei lähde kieppumaan, niin aseta
RigidBody2D / Constraints / Freeze Rotation Z päälle

Voit kokeilla siirtää Main Camera-objektin pelaajalle, kamera seuraa pelaajaa ja voit esimerkiksi laajentaa tasoa nyt helposti suuremmaksi.
Kun pelaaja tippuu pitäisi pelin päättyä. Lisätään Update()-metodiin tarkistus: jos y-koordinaatti on riittävän alhalla (riippuu peli-ikkunastasi) niin peli päättyy ja näytetään Game Over-scene.
Scenen lisääminen mukaan projektille

Scenen vaihtaminen pelissä kun hahmo tippuu:
using UnityEngine.SceneManagement;
if (rb.transform.position.y < -10)
{
SceneManager.LoadScene("GameOver");
}
GameOverScript:
using UnityEngine.SceneManagement;
public class GameOverScript : MonoBehaviour
{
public void StartGame()
{
SceneManager.LoadScene("Game");
}
}
GameOver-scene, GameOverController:
Laadi jokin tuli, piikki, lima tai muu ektoplasma johon astuminen on vahingollista hahmolle ja aiheuttaa pelin päättymisen.
private void OnTriggerEnter2D(Collider2D col)
{
if (col.gameObject.tag == "spike")
{
// osuttiin piikkiin - pelin pitäisi päättyä
Debug.Log("spike: " + col.gameObject.name);
}
}
Kun pelaaja osuu piikkiin pitäisi pelin päättyä.
public int score;
private void OnTriggerEnter2D(Collider2D col)
{
if (col.gameObject.tag == "spike")
{
// osuttiin piikkiin - pelin pitäisi päättyä
Debug.Log("spike: " + col.gameObject.name);
}
if (col.gameObject.tag == "fruit") {
// kasvata pisteitä yhdellä
Debug.Log("score: " + score);
// poista törmätty objekti
col.gameObject.SetActive(false);
}
}
public TextMeshProUGUI txtScore;Tarvittaessa lisää kirjasto
using TMPro;
txtScore.text = "Pisteet:" + score;
PlayerPrefs.SetInt("PlayerScore", 0);
PlayerPrefs.SetInt("PlayerScore", score);
int score = PlayerPrefs.GetInt("PlayerScore");
public TextMeshProUGUI txtScore;
public void Start()
{
int score = PlayerPrefs.GetInt("PlayerScore");
txtScore.text = "Pisteet:" + score;
}
using System.IO;
string fileName = "Scores.csv"; string path = "Assets/Resources/" + fileName; StreamWriter writer = new StreamWriter(path, true); writer.WriteLine(score); writer.Close();
System.DateTime.Now.
string row = score + "; " + System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
Pääasiallinen lähde tälle demolle on youtube-video jossa käydään sama asia läpi.