Âm thanh bước chân theo bề mặt

Tags:
Audio
Physics
Player
Effects

C# Code

using UnityEngine;
using System.Collections.Generic;

public class FootstepSound : MonoBehaviour
{
    public AudioSource audioSource;
    public float stepRate = 0.5f;
    public float stepCooldown = 0.5f;
    private float lastStepTime = 0f;

    // Định nghĩa âm thanh cho từng loại bề mặt
    [System.Serializable]
    public class SurfaceSound
    {
        public string tag;
        public AudioClip[] clips;
    }

    public List<SurfaceSound> surfaceSounds = new List<SurfaceSound>();
    private Dictionary<string, AudioClip[]> soundDictionary = new Dictionary<string, AudioClip[]> ();

    void Start()
    {
        // Chuyển List thành Dictionary để truy cập nhanh hơn
        foreach (var ss in surfaceSounds)
        {
            soundDictionary[ss.tag] = ss.clips;
        }
    }

    // Gọi hàm này từ Animation Event trong animation đi/chạy của nhân vật
    public void PlayFootstepSound()
    {
        // Kiểm tra cooldown để tránh phát âm thanh quá dày
        if (Time.time - lastStepTime < stepCooldown) return;
        lastStepTime = Time.time;

        // Bắn một Raycast xuống dưới để xác định bề mặt
        RaycastHit hit;
        if (Physics.Raycast(transform.position, Vector3.down, out hit, 1.5f))
        {
            string surfaceTag = hit.collider.tag;

            if (soundDictionary.ContainsKey(surfaceTag))
            {
                AudioClip[] clips = soundDictionary[surfaceTag];
                if (clips.Length > 0)
                {
                    AudioClip clip = clips[Random.Range(0, clips.Length)];
                    audioSource.PlayOneShot(clip);
                }
            }
            else
            {
                // Phát âm thanh mặc định nếu không tìm thấy tag
                // (Bạn có thể thêm một SurfaceSound với tag "Untagged")
            }
        }
    }
}

Phát ra các âm thanh bước chân khác nhau tùy thuộc vào loại bề mặt vật liệu (qua Tag) mà người chơi đang đi trên đó, ví dụ: cỏ, gỗ, đá.

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Tạo một viên đạn (projectile) tại một điểm và bắn nó đi theo một hướng xác định. Thường dùng cho nhân vật hoặc kẻ địch.

Gameplay
Player
Spawning
Physics

Giúp nhân vật đứng vững trên các nền tảng di chuyển (moving platforms) bằng cách tạm thời đặt nhân vật làm con của nền tảng đó.

Movement
Player
Physics
Platformer

Giữ một đối tượng trong một vùng hình chữ nhật xác định bằng cách sử dụng hàm Mathf.Clamp() để giới hạn giá trị tọa độ x và y.

Movement
Physics
Player
Boundaries

Sử dụng Tilemap Collider 2D và Composite Collider 2D để tạo ra một vùng đi lại duy nhất cho nhân vật, ngăn họ đi xuyên tường hoặc ra khỏi bản đồ.

2D
Movement
Player
Physics
Tilemap

Tạo hiệu ứng nhấp nháy cho Sprite Renderer, thường được sử dụng khi nhân vật nhận sát thương để biểu thị trạng thái bất tử tạm thời.

Effects
Visuals
Player

Cho phép người chơi nhặt các vật thể có Rigidbody, giữ chúng trước mặt và ném đi bằng một lực.

Physics
Rigidbody
Interaction
Player

Cho phép người chơi đẩy các vật thể có Rigidbody khi di chuyển vào chúng. Lực đẩy có thể điều chỉnh được.

Physics
Interaction
Player
Gameplay

AI sẽ bắn đạn về phía người chơi khi họ ở trong tầm tấn công và có một khoảng thời gian chờ (cooldown) giữa mỗi lần bắn.

AI
Gameplay
Spawning
Physics

AI sẽ phát hiện người chơi trong một phạm vi nhất định và bắt đầu di chuyển về phía họ. Khi người chơi ra khỏi phạm vi, AI sẽ dừng lại.

AI
Movement
Gameplay
Player

Cho phép người chơi di chuyển nhân vật đến một vị trí trên mặt đất bằng cách chạm vào điểm đó trên màn hình. Sử dụng Raycast để xác định vị trí trong không gian 3D.

Mobile
3D
Movement
Player
Input