Mıknatıs
Coddy'nin Unity Oyunu: Gökyüzü Şeritleri kursunda ders 14 / 20.
Güçlendirmeler, her koşuyu bir öncekinden farklı hissettirir. İlki bir mıknatıstır: 8 saniye boyunca koşucunun yakınındaki her madeni para ona doğru uçar.
Runner, kalan süreyi magnet içinde tutar ve geri sayar. Her madeni para koşucuya bakar ve mıknatıs etkinken koşucu yakınındaysa ona doğru hareket eder:
if (runner.magnet > 0f && Vector3.Distance(transform.position, runner.transform.position) < pullRange)
{
transform.position = Vector3.MoveTowards(transform.position, runner.transform.position, pullSpeed * Time.deltaTime);
}Açılan tetikleyici gerisini halleder ve madeni para koşucuya uçar. Ara sıra yolun bir bölümünde, engellerden 6 birim önce pembe bir mıknatıs güçlendirmesi belirir.
Görev
KolayRunneriçinepublic float magnetTime = 8f;vepublic float magnet;ekle. 0'dan büyük olduğu sürece her karede değerini azalt.- OnTriggerEnter içinde,
Magnetetiketimagnet = magnetTimedeğerini atar ve toplanabilir nesneyi yok eder. CoiniçinepullRange = 7fvepullSpeed = 30fekle, Start içinde Runner'ı bul ve yukarıdaki gibi çek.RoadiçinemagnetPrefabekle. Fill'in sonundafloat roll = Random.value;kullan veroll < 0.06fise rastgele bir şeride y 1, z -6 konumunda bir mıknatıs yerleştir.
Kendin dene
using UnityEngine;
public class Runner : MonoBehaviour
{
public float laneWidth = 2.5f;
public float laneSpeed = 16f;
public float jumpHeight = 1.6f;
public float gravity = -40f;
public float slideTime = 0.7f;
public int lane;
private CharacterController controller;
private GameManager game;
private float fallSpeed;
private float slide;
void Start()
{
controller = GetComponent<CharacterController>();
game = FindFirstObjectByType<GameManager>();
}
void Update()
{
if (!game.over)
{
if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
if (jump && controller.isGrounded)
{
fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
StopSlide();
}
if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
{
slide = slideTime;
Resize(0.5f);
}
}
if (slide > 0f)
{
slide -= Time.deltaTime;
if (slide <= 0f) StopSlide();
}
if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
fallSpeed += gravity * Time.deltaTime;
float targetX = lane * laneWidth;
float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
controller.Move(move);
}
void StopSlide()
{
if (transform.localScale.y < 1f) Resize(1f);
slide = 0f;
}
void Resize(float height)
{
controller.enabled = false;
transform.position += Vector3.up * (height - transform.localScale.y);
transform.localScale = new Vector3(1f, height, 1f);
controller.enabled = true;
}
void OnTriggerEnter(Collider other)
{
if (game.over) return;
if (other.CompareTag("Obstacle"))
{
game.GameOver();
}
else if (other.CompareTag("Coin"))
{
game.AddCoin();
Destroy(other.gameObject);
}
}
}
Unity Oyunu: Gökyüzü Şeritleri bölümündeki tüm dersler
Kendi başına pratik yap: Unity playground