Menu
CoddyTech

Girdi Eylemleri

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 47 / 60.

Tuşları teker teker sınamak, betiği klavyeye bağlar. Bunun yerine bir eylem, oyuncunun ne yaptığını belirtir; proje de hangi tuşların, çubukların ve düğmelerin bu eylemi tetiklediğini listeler. Yeni bir Unity 6 projesi, bir dizi eylemle birlikte gelir (proje genelindeki eylemler olarak ayarlanmış InputSystem_Actions varlığı); bu varlığın Player haritasında Move (WASD, ok tuşları ve oyun kumandasının sol çubuğu), Look (fare veya sağ çubuk), Attack (sol fare düğmesi ve Enter), Interact (basılı tutulan E), Crouch (C), Jump (Space ve oyun kumandasının güney düğmesi), Previous ve Next (1 ve 2) ile Sprint (Left Shift) bulunur. Bu eylemler başlangıçtan itibaren etkindir ve InputSystem.actions.FindAction("Jump") adını kullanarak bir eylemi bulur. Yandan görünen bu pençe vinci x ve y eksenlerinde hareket eder, Jump ile nesneleri yakalar:

using UnityEngine;
using UnityEngine.InputSystem;

public class ClawCrane : MonoBehaviour
{
    public float speed = 3f;

    private InputAction moveAction;
    private InputAction jumpAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        jumpAction = InputSystem.actions.FindAction("Jump");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, input.y, 0f) * speed * Time.deltaTime;

        if (jumpAction.WasPressedThisFrame())
            Debug.Log("Grab!");
    }
}

Eylemler Start içinde bir kez bulunur ve InputAction alanlarında saklanır. Move bir Vector2 verir: x, tuşlardaki sağ ve solu; y ise yukarı ve aşağıyı belirtir. Değer normalleştirilir; bu nedenle W ve D'ye birlikte basıldığında (1, 1) yerine (0.71, 0.71) elde edilir. Vinç yandan göründüğü için bu y değerini yükseklik olarak kullanır; yukarıdan görünen bir oyunda ise z için kullanılır. Düğme eylemleri tuşlar gibi yanıt verir: WasPressedThisFrame(), WasReleasedThisFrame() ve IsPressed(). İki hata fırlatılır: yanlış yazılmış bir ad, FindAction işlevinin null döndürmesine neden olur (ilk okumada NullReferenceException oluşur); Move üzerinde ReadValue<Vector3>() kullanmak ise bir tuşa basıldığı anda InvalidOperationException fırlatır, çünkü Move bir Vector2 barındırır.

challenge icon

Görev

Orta

Haritacıyı yürütün ve projenin eylemleriyle bayrak dikin.

  1. Start() içinde moveAction, jumpAction ve attackAction değerlerini InputSystem.actions.FindAction("Move"), "Jump" ve "Attack" ile ayarlayın.
  2. Update() içinde moveAction.ReadValue<Vector2>() değerini speed ile çarparak yürüyün; y değeri z ekseni boyunca olsun.
  3. jumpAction.WasPressedThisFrame() çağrıldığında Plant(), Attack tuşuna basıldığında ise PullUp() çağırın.

“Oyna” düğmesine basın, üç bayrak dikin ve birini sökmek için tıklayın. Ardından “Kontrol et” düğmesine basın.

Kendin dene

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Surveyor : MonoBehaviour
{
    public float speed = 4f;
    public int flags = 3;
    public GameObject flagPrefab;

    private InputAction moveAction;
    private InputAction jumpAction;
    private InputAction attackAction;
    private List<GameObject> planted = new List<GameObject>();

    void Start()
    {
        // Move, Jump ve Attack eylemlerini bul
    }

    void Update()
    {
        // Move ile yürü, Jump tuşuna basıldığında Plant(), Attack tuşuna basıldığında PullUp() çağır
    }

    void Plant()
    {
        if (flags == 0) return;
        Vector3 spot = new Vector3(transform.position.x, 0.75f, transform.position.z);
        planted.Add(Instantiate(flagPrefab, spot, Quaternion.identity));
        flags--;
        Debug.Log("Flags left: " + flags);
    }

    void PullUp()
    {
        if (planted.Count == 0) return;
        GameObject last = planted[planted.Count - 1];
        planted.RemoveAt(planted.Count - 1);
        Destroy(last);
        flags++;
        Debug.Log("Flags left: " + flags);
    }
}

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground