项目实训(十二)FPS游戏之角色移动的脚步声


前言

FPS游戏之角色移动的脚步声
FootstepAudioData 脚本起到了保存人物的脚步声的作用,使得人物在行进过程中伴随着产生已保存的能够增强体验感的脚步声。
PlayerFootstepListener 在脚本中会判断角色发出声音的必备条件,当角色移动或者发生较大幅度动作的时候发出脚步的声音,使用Physic API检测角色是否有移动,同时用Physic API来实现角色踩踏位置的对应材质的声音。


一、存放脚步声音

创建一个FootstepAudioData脚本存放,并用一个列表存放声音
在这里插入图片描述

CreateAssetMenu(menuName = "FPS/Footstep Audio Data")]
public class FootstepAudioData : ScriptableObject
{
    public List<FootstepAudio> FootstepAudios = new List<FootstepAudio>();
}


[System.Serializable]
public class FootstepAudio
{
    public string Tag;
    public List<AudioClip> AudioClips = new List<AudioClip>();
    public float Delay;
}

并在物体上设置好对应的组件
在这里插入图片描述

二、设置脚步声

1.角色发出声音的必备条件

角色移动或者发生较大幅度动作的时候发出声音

2.如何检测角色是否有移动

用Physic API检测

if (characterController.velocity.normalized.magnitude >= 0.1f)
            {
                nextPlayTime += Time.deltaTime;

                if (characterController.velocity.magnitude >= 4)
                {
                    characterState = State.Sprinting;
                }
                
                bool tmp_IsHit = Physics.Linecast(footstepTransform.position,
                    footstepTransform.position +
                    Vector3.down * (characterController.height / 2 + characterController.skinWidth-characterController.center.y),
                    out RaycastHit tmp_HitInfo,
                    LayerMask);

3.如何实现角色踩踏位置的对应材质的声音

用Physic API检测

 if (tmp_IsHit)
                {
                    //TODO:检测类型
                    foreach (var tmp_AudioElement in FootstepAudioData.FootstepAudios)
                    {
                        if (tmp_HitInfo.collider.CompareTag(tmp_AudioElement.Tag))
                        {
                          
                            if (nextPlayTime >= tmp_AudioElement.Delay)
                            {
                                //TODO:播放移动声音
                                int tmp_AudioCount = tmp_AudioElement.AudioClips.Count;
                                int tmp_AudioIndex = UnityEngine.Random.Range(0, tmp_AudioCount);
                                AudioClip tmp_FootstepAudioClip = tmp_AudioElement.AudioClips[tmp_AudioIndex];
                                FootstepAudioSource.clip = tmp_FootstepAudioClip;
                                FootstepAudioSource.Play();
                                nextPlayTime = 0;
                                break;
                            }
                        }
                    }
                }

三、修复下蹲移动时没有脚步声音

选中一个物体,点击面板中的layer

在这里插入图片描述
然后点击addlayer 点击player如下图
在这里插入图片描述
然后将layer mask设置为default
在这里插入图片描述

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写FPS角色移动、跳跃、射击可以使用游戏引擎来实现,以下是基于Unity引擎的示例代码: 移动: ```csharp public class PlayerMovement : MonoBehaviour { public float speed = 10f; // 玩家移动速度 private void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 direction = new Vector3(horizontal, 0f, vertical).normalized; // 获取玩家移动方向 transform.Translate(direction * speed * Time.deltaTime); // 移动玩家 } } ``` 跳跃: ```csharp public class PlayerJump : MonoBehaviour { public float jumpForce = 5f; // 玩家跳跃力度 public float groundDistance = .2f; // 地面检测距离 public LayerMask groundMask; // 地面的层级 private Rigidbody rb; private bool isGrounded = true; private void Start() { rb = GetComponent<Rigidbody>(); } private void Update() { isGrounded = Physics.CheckSphere(transform.position, groundDistance, groundMask); // 检测玩家是否在地面上 if (isGrounded && Input.GetKeyDown(KeyCode.Space)) // 按下空格键并且在地面上 { rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); // 给玩家添加向上的力 isGrounded = false; } } } ``` 射击: ```csharp public class PlayerShoot : MonoBehaviour { public GameObject bulletPrefab; // 子弹预制体 public Transform firePoint; // 发射点 public float bulletSpeed = 10f; // 子弹速度 private void Update() { if (Input.GetButtonDown("Fire1")) // 按下鼠标左键 { GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation); // 创建子弹 Rigidbody bulletRb = bullet.GetComponent<Rigidbody>(); bulletRb.velocity = firePoint.forward * bulletSpeed; // 子弹向前发射 } } } ``` 以上是基于Unity引擎的示例代码,不同的游戏引擎实现方式可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值