We wcześniejszych e‑materiałach z tej serii stworzyliśmy grę, w której można zbierać punkty, awansować do kolejnego poziomu lub stracić życie i odrodzić się na początku rundy. W grę można już zagrać, jednak pozostało kilka niedociągnięć, które możemy naprawić.
Ruch postaci
Chcemy, aby ruch postaci charakteryzował się płynnością. Dlatego nie powinna ona zatrzymywać się w sytuacjach, w których nie zdecydował o tym gracz. W dotychczasowej wersji gry zdarza się to np. przy zbieraniu punktowanych elementów lub w trakcie kolizji z platformą. Dodatkowo możemy poprawić skok postaci oraz zredukować efekt ślizgania się bohatera na platformie.
Kolizja z punktowanym obiektem
W e‑materiale Zdobywanie punktów – Unity Hub, etap VIIP125LiIJKZdobywanie punktów – Unity Hub, etap VII zastosowaliśmy do kolizji bohatera z punktowanym obiektem funkcji OnCollisionEnter2D. Poskutkowało to efektem zatrzymania postaci przy kontakcie ze zbieranym obiektem.
Aby to naprawić, klikamy prefabprefabprefab punktowanego obiektu, następnie w obszarze Inspector szukamy komponentu Box Collider 2D i zaznaczamy w nim opcję Is Trigger. Następnie w skrypcie odpowiedzialnym za ruch postaci przenosimy kolizję z punktowanym obiektem do nowej funkcji OnTriggerEnter2D. Dzięki tej zmianie kolizja z tego typu obiektem jest nadal wykrywana, ale nie oddziałuje z ciałem bohatera.
Warto pamiętać, że ponieważ punktowany obiekt zamieniliśmy na prefab, wprowadzane w nim zmiany zostaną uwzględnione we wszystkich jego instancjach.
Skok
Jeśli chcemy poprawić wygląd skoku postaci, możemy zmodyfikować zmienne odpowiedzialne za grawitację oraz wysokość skoku. W tym celu w obszarze Hierarchy zaznaczamy obiekt bohatera, a następnie w obszarze Inspector szukamy:
pola Grawity Scale w komponencie Rigidbody 2D, w którym możemy modyfikować grawitację działającą na ciało gracza;
pola Skok, które powstało w wyniku zastosowania atrybutu SerializedFiled w skrypcie odpowiedzialnym za ruch postaci (zostało to opisane w e‑materiale Implementacja skoku postaci – Unity Hub, etap IIP7fG3v9f5Implementacja skoku postaci – Unity Hub, etap II; korzystając z tego pola możemy modyfikować wysokość skoku.
Ślizganie się
Jeśli przeszkadza nam efekt ślizgania się postaci po platformach, możemy to poprawić. W tym celu w skrypcie odpowiedzialnym za ruch postaci odnajdujemy funkcję GetAxis i zamieniamy ją na GetAxisRaw.
Zatrzymywanie się na platformach
Kolejnym błędem w ruchu postaci, który możemy poprawić, to niepotrzebne zatrzymywanie się na platformach. Wynika ono z tego, że każda z platform posiada osobne granice kolizji. Naprawiamy to, dodając do prefabu platformy komponent Composite Collider 2D, który łączy kilka sąsiadujących obszarów kolizji w jeden duży.
Unity doda fizyczne ciało do platformy. Ponieważ nie chcemy, by działała na nie grawitacja, w komponencie Rigidbody 2D wybierzemy w polu Body Type opcję Static.
W ostatnim kroku w komponencie Box Collider 2Dzaznaczamy opcję Used By Composite.
Skrypt ruchu postaci:
Linia 1. using System kropka Collections średnik.
Linia 2. using System kropka Collections kropka Generic średnik.
Linia 3. using TMPro średnik.
Linia 4. using UnityEngine średnik.
Linia 5. using UnityEngine kropka SceneManagement średnik.
Linia 7. public class ruch podkreślnik gracza dwukropek MonoBehaviour.
Linia 8. otwórz nawias klamrowy.
Linia 10. private Rigidbody2D cialo średnik.
Linia 11. otwórz nawias kwadratowy SerializeField zamknij nawias kwadratowy private float szybkosc średnik.
Linia 12. otwórz nawias kwadratowy SerializeField zamknij nawias kwadratowy private float skok średnik.
Linia 13. private BoxCollider2D kolizja średnik.
Linia 14. private Animator animator średnik.
Linia 15. otwórz nawias kwadratowy SerializeField zamknij nawias kwadratowy private LayerMask warstwaKolizyjna średnik.
Linia 16. otwórz nawias kwadratowy SerializeField zamknij nawias kwadratowy private int zebrane podkreślnik wisienki średnik.
Linia 17. public TextMeshProUGUI wisienki podkreślnik tekst średnik.
Linia 19. prawy ukośnik prawy ukośnik Start is called before the first frame update.
Linia 20. void Start otwórz nawias okrągły zamknij nawias okrągły.
Linia 21. otwórz nawias klamrowy.
Linia 22. zamknij nawias klamrowy.
Linia 24. private void Awake otwórz nawias okrągły zamknij nawias okrągły.
Linia 25. otwórz nawias klamrowy.
Linia 26. cialo znak równości GetComponent otwórz nawias ostrokątny Rigidbody2D zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 27. kolizja znak równości GetComponent otwórz nawias ostrokątny BoxCollider2D zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 28. animator znak równości GetComponent otwórz nawias ostrokątny Animator zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 29. zamknij nawias klamrowy.
Linia 31. prawy ukośnik prawy ukośnik Update is called once per frame.
Linia 32. void Update otwórz nawias okrągły zamknij nawias okrągły.
Linia 33. otwórz nawias klamrowy.
Linia 35. cialo kropka velocity znak równości new Vector2 otwórz nawias okrągły Input kropka GetAxisRaw otwórz nawias okrągły cudzysłów Horizontal cudzysłów zamknij nawias okrągły asterysk szybkosc przecinek cialo kropka velocity kropka y zamknij nawias okrągły średnik.
Linia 37. if otwórz nawias okrągły Input kropka GetAxisRaw otwórz nawias okrągły cudzysłów Horizontal cudzysłów zamknij nawias okrągły wykrzyknik znak równości 0f zamknij nawias okrągły.
Linia 38. otwórz nawias klamrowy.
Linia 39. animator kropka SetBool otwórz nawias okrągły cudzysłów Chodzenie cudzysłów przecinek true zamknij nawias okrągły średnik.
Linia 40. if otwórz nawias okrągły Input kropka GetAxisRaw otwórz nawias okrągły cudzysłów Horizontal cudzysłów zamknij nawias okrągły zamknij nawias ostrokątny 0f zamknij nawias okrągły.
Linia 41. otwórz nawias klamrowy.
Linia 42. transform kropka localScale znak równości new Vector3 otwórz nawias okrągły 5 przecinek 5 przecinek 1 zamknij nawias okrągły średnik.
Linia 43. zamknij nawias klamrowy.
Linia 44. else.
Linia 45. otwórz nawias klamrowy.
Linia 46. transform kropka localScale znak równości new Vector3 otwórz nawias okrągły minus 5 przecinek 5 przecinek 1 zamknij nawias okrągły średnik.
Linia 47. zamknij nawias klamrowy.
Linia 48. zamknij nawias klamrowy.
Linia 49. else.
Linia 50. otwórz nawias klamrowy.
Linia 51. animator kropka SetBool otwórz nawias okrągły cudzysłów Chodzenie cudzysłów przecinek false zamknij nawias okrągły średnik.
Linia 52. zamknij nawias klamrowy.
Linia 54. if otwórz nawias okrągły Input kropka GetKey otwórz nawias okrągły KeyCode kropka Space zamknij nawias okrągły ampersant ampersant NaZiemi otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły.
Linia 55. otwórz nawias klamrowy.
Linia 56. cialo kropka velocity znak równości new Vector2 otwórz nawias okrągły cialo kropka velocity kropka x przecinek skok zamknij nawias okrągły średnik.
Linia 57. animator kropka SetBool otwórz nawias okrągły cudzysłów Skok cudzysłów przecinek true zamknij nawias okrągły średnik.
Linia 58. zamknij nawias klamrowy.
Linia 60. if otwórz nawias okrągły cialo kropka velocity kropka y otwórz nawias ostrokątny znak równości 0 zamknij nawias okrągły.
Linia 61. otwórz nawias klamrowy.
Linia 62. animator kropka SetBool otwórz nawias okrągły cudzysłów Skok cudzysłów przecinek false zamknij nawias okrągły średnik.
Linia 63. animator kropka SetBool otwórz nawias okrągły cudzysłów Spadek cudzysłów przecinek true zamknij nawias okrągły średnik.
Linia 64. zamknij nawias klamrowy.
Linia 66. if otwórz nawias okrągły NaZiemi otwórz nawias okrągły zamknij nawias okrągły ampersant ampersant animator kropka GetBool otwórz nawias okrągły cudzysłów Spadek cudzysłów zamknij nawias okrągły znak równości znak równości true zamknij nawias okrągły.
Linia 67. otwórz nawias klamrowy.
Linia 68. animator kropka SetBool otwórz nawias okrągły cudzysłów Spadek cudzysłów przecinek false zamknij nawias okrągły średnik.
Linia 69. zamknij nawias klamrowy.
Linia 71. if otwórz nawias okrągły transform kropka position kropka y otwórz nawias ostrokątny minus 10 zamknij nawias okrągły.
Linia 72. otwórz nawias klamrowy.
Linia 73. Odrodzenie otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 74. zamknij nawias klamrowy.
Linia 76. zamknij nawias klamrowy.
Linia 78. private bool NaZiemi otwórz nawias okrągły zamknij nawias okrągły.
Linia 79. otwórz nawias klamrowy.
Linia 80. return Physics2D kropka BoxCast otwórz nawias okrągły kolizja kropka bounds kropka center przecinek kolizja kropka bounds kropka size przecinek 0f przecinek Vector2 kropka down przecinek 0 kropka 1f przecinek warstwaKolizyjna zamknij nawias okrągły średnik.
Linia 81. zamknij nawias klamrowy.
Linia 83. private void Odrodzenie otwórz nawias okrągły zamknij nawias okrągły.
Linia 84. otwórz nawias klamrowy.
Linia 85. SceneManager kropka LoadScene otwórz nawias okrągły SceneManager kropka GetActiveScene otwórz nawias okrągły zamknij nawias okrągły kropka name zamknij nawias okrągły średnik.
Linia 86. zamknij nawias klamrowy.
Linia 88. private void OnCollisionEnter2D otwórz nawias okrągły Collision2D collision zamknij nawias okrągły.
Linia 89. otwórz nawias klamrowy.
Linia 90. if otwórz nawias okrągły collision kropka gameObject kropka CompareTag otwórz nawias okrągły cudzysłów pułapki cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 91. otwórz nawias klamrowy.
Linia 92. Odrodzenie otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 93. zamknij nawias klamrowy.
Linia 95. if otwórz nawias okrągły collision kropka gameObject kropka CompareTag otwórz nawias okrągły cudzysłów portal cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 96. otwórz nawias klamrowy.
Linia 97. if otwórz nawias okrągły SceneManager kropka GetActiveScene otwórz nawias okrągły zamknij nawias okrągły kropka name znak równości znak równości cudzysłów poziom1 cudzysłów zamknij nawias okrągły.
Linia 98. otwórz nawias klamrowy.
Linia 99. SceneManager kropka LoadScene otwórz nawias okrągły cudzysłów poziom2 cudzysłów zamknij nawias okrągły średnik.
Linia 100. zamknij nawias klamrowy.
Linia 101. zamknij nawias klamrowy.
Linia 104. zamknij nawias klamrowy.
Linia 106. private void OnTriggerEnter2D otwórz nawias okrągły Collider2D collision zamknij nawias okrągły.
Linia 107. otwórz nawias klamrowy.
Linia 108. if otwórz nawias okrągły collision kropka gameObject kropka CompareTag otwórz nawias okrągły cudzysłów wisienka cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 109. otwórz nawias klamrowy.
Linia 110. Destroy otwórz nawias okrągły collision kropka gameObject zamknij nawias okrągły średnik.
Linia 111. zebrane podkreślnik wisienki plus plus średnik.
Linia 112. wisienki podkreślnik tekst kropka text znak równości cudzysłów x cudzysłów plus zebrane podkreślnik wisienki kropka ToString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 113. zamknij nawias klamrowy.
Linia 114. zamknij nawias klamrowy.
Linia 115. zamknij nawias klamrowy.
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ruch_gracza : MonoBehaviour
{
private Rigidbody2D cialo;
[SerializeField] private float szybkosc;
[SerializeField] private float skok;
private BoxCollider2D kolizja;
private Animator animator;
[SerializeField] private LayerMask warstwaKolizyjna;
[SerializeField] private int zebrane_wisienki;
public TextMeshProUGUI wisienki_tekst;
// Start is called before the first frame update
void Start()
{
}
private void Awake()
{
cialo = GetComponent<Rigidbody2D>();
kolizja = GetComponent<BoxCollider2D>();
animator = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
cialo.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * szybkosc, cialo.velocity.y);
if (Input.GetAxisRaw("Horizontal") != 0f)
{
animator.SetBool("Chodzenie", true);
if (Input.GetAxisRaw("Horizontal") > 0f)
{
transform.localScale = new Vector3(5, 5, 1);
}
else
{
transform.localScale = new Vector3(-5, 5, 1);
}
}
else
{
animator.SetBool("Chodzenie", false);
}
if (Input.GetKey(KeyCode.Space) && NaZiemi())
{
cialo.velocity = new Vector2(cialo.velocity.x, skok);
animator.SetBool("Skok", true);
}
if (cialo.velocity.y <= 0)
{
animator.SetBool("Skok", false);
animator.SetBool("Spadek", true);
}
if (NaZiemi() && animator.GetBool("Spadek") == true)
{
animator.SetBool("Spadek", false);
}
if (transform.position.y < -10)
{
Odrodzenie();
}
}
private bool NaZiemi()
{
return Physics2D.BoxCast(kolizja.bounds.center, kolizja.bounds.size, 0f, Vector2.down, 0.1f, warstwaKolizyjna);
}
private void Odrodzenie()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("pułapki"))
{
Odrodzenie();
}
if (collision.gameObject.CompareTag("portal"))
{
if (SceneManager.GetActiveScene().name == "poziom1")
{
SceneManager.LoadScene("poziom2");
}
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("wisienka"))
{
Destroy(collision.gameObject);
zebrane_wisienki++;
wisienki_tekst.text = "x " + zebrane_wisienki.ToString();
}
}
}
Wyświetlanie punktacji
Gra będzie odtwarzana na ekranach o różnej rozdzielczości, dlatego dostosujemy do takiej sytuacji pole tekstowe, w którym wyświetlana jest punktacja. W tym celu zmieniamy punkt zaczepienia tekstu. Klikamy na obiekt tekstu, a następnie w jego obszarze Inspector szukamy pola Rect Transform. Naciskamy na ikonę siatki i przytrzymując klawisz shift, ustawiamy punkt zaczepienia w lewym górnym rogu.
R1CELlANG2SEd
Grafika przedstawia grę platformową w programie Unity. Widoczne są platformy do skoku i wisienki do zbierania.
Źródło: Contentplus.pl sp. z o. o., licencja: CC BY-SA 3.0.
Eksport gry
Aby wyeksportować grę, z menu File wybieramy opcję Bulid Settings. W pojawiającym się oknie wybieramy platformę, na którą chcemy weksportować grę, np. komputer osobisty. Na koniec naciskamy przycisk Bulid And Run, a następnie wybieramy miejsce zapisu pliku.
rodzaj zasobu, którego instancje można wykorzystywać wielokrotnie w projekcie; jeśli zajdą zmiany w prefabie, Unity automatycznie wprowadzi je we wszystkich jego instancjach
tag
tag
słowo referencyjne, które można przypisać do jednego lub większej liczby obiektów; tagi pomagają zidentyfikować obiekty do celów skryptowych