Menu
CoddyTech

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.

challenge icon

Görev

Kolay
  1. Runner içine public float magnetTime = 8f; ve public float magnet; ekle. 0'dan büyük olduğu sürece her karede değerini azalt.
  2. OnTriggerEnter içinde, Magnet etiketi magnet = magnetTime değerini atar ve toplanabilir nesneyi yok eder.
  3. Coin içine pullRange = 7f ve pullSpeed = 30f ekle, Start içinde Runner'ı bul ve yukarıdaki gibi çek.
  4. Road içine magnetPrefab ekle. Fill'in sonunda float roll = Random.value; kullan ve roll < 0.06f ise 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