想给UNITY里面 加一个移动就播放声音的脚本,如何控制这个声音的开和关

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想给UNITY里面 加一个移动就播放声音的脚本,如何控制这个声音的开和关相关的知识,希望对你有一定的参考价值。

我现在只能做到移动播放完整的声音,但是停下来却还在播放,急求

移动的话就意味着有按键事件(假设是W),停下来的话就意味着没有任何按键
if(Input.GetKey (KeyCode.W) && !audio.isPlaying) //有移动键按下并且声音并不是播放状态

audio.Play(); //播放声音


if(!Input.anyKey && audio.isPlaying) //没有任何键按下并且声音是播放状态

audio.stop(); //停止播放声音

追问

大神,我是在unity里面的第一人称脚本上加的声音控制,这个脚本可行么? 我JAVA不是很懂,!是比较什么意思 求解释 感激不尽

追答

这个脚本肯定不能直接挂上去用,这只是一个思路,第一个if:判断你是否按下了移动键,可以把你设定的所有移动键都加进去(WASD什么的),如果有相关按键按下(Input.GetKey (KeyCode.W)
为真),并且你按下移动键的时候声音没有播放(!audio.isPlaying为真),那么就播放声音(第二个条件用来防止你按住移动键的时候此循环连续执行);
第二个if:当没有任何按键事件的时候(!Input.anyKey为真),并且声音依旧在播放(audio.isPlaying)为真,那么就停止播放声音。(audio是你的Audiosource脚本的引用)

参考技术A 你可以停下来以后把那个audio的声音的value设为0 参考技术B 调用AudioSource.stop()

Unity 播放序列帧

前一阵子写了一个播放序列帧的小脚本,本以为只是临时用一用,但是后来发现这个脚本能频繁的用在项目的其他地方,所以决定优化一下。
这个脚本参考了NGUI的 UI2DSpriteAnimation 脚本,里面有很多不错的思想,这里只是做了一些修修补补的工作。

只需要将这个脚本挂载到任意游戏物体上,animImage变量为要播放序列帧的UGUI Image
OK,上脚本

using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 播放2D序列帧
/// </summary>

public class SpriteAnimation : MonoBehaviour
{
    /// <summary>
    /// 播放序列帧的UI Image
    /// </summary>
    [SerializeField]
    private Image animImage;

    /// <summary>
    /// 当前播放的帧在数组中的索引。
    /// 正向播放且不循环时 数字不可大于等于序列帧数组索引。
    /// 倒序播放且不循环时 数字不能小于等于0
    /// </summary>
    public int frameIndex = 0;

    /// <summary>
    /// 每秒播放多少多少帧(不可为0) 
    /// 数字大于0为正向播放,数字小于0为倒序播放
    /// </summary>
    [SerializeField]
    private int framerate = 20;

    /// <summary>
    /// 是否受TimeScale的影响
    /// </summary>
    public bool ignoreTimeScale = true;

    /// <summary>
    /// 是否循环播放
    /// </summary>
    public bool isLoop = true;

    /// <summary>
    /// 存放所有序列帧sprite的数组
    /// </summary>
    public Sprite[] frames;

    /// <summary>
    /// 序列帧更新时间
    /// </summary>
    private float mUpdate = 0f;

    /// <summary>
    /// Continue playing the animation. If the animation has reached the end, it will restart from beginning
    /// </summary>
    public void Play()
    {
        if (!enabled && !isLoop)
        {
            //判断是正向播放还是倒序播放
            int newIndex = framerate > 0 ? frameIndex + 1 : frameIndex - 1;

            //
            if (newIndex < 0 || newIndex >= frames.Length)
            {
                frameIndex = framerate < 0 ? frames.Length - 1 : 0;
            }
        }

        enabled = true;
        UpdateSprite();
    }

    /// <summary>
    /// 暂停播放
    /// </summary>
    public void Pause()
    {
        enabled = false;
    }

    /// <summary>
    /// 回到最初的序列帧,等待播放
    /// </summary>
    public void ResetToBeginning()
    {
        frameIndex = framerate < 0 ? frames.Length - 1 : 0;
        UpdateSprite();
    }

    void Update()
    {
        //获取当前的游戏内时间,用于和序列帧更新时间做比较
        float time = ignoreTimeScale ? Time.unscaledTime : Time.time;

        //这里将 当前游戏时间(time) 和 上次更新的序列帧时间(mUpdate) 进行比对
        //如果 mUpdate<time,说明:更新序列帧之前的时间+序列帧两张间隔时间 小于 游戏内时间,则需要将两个时间线统一,然后再更新序列帧图片
        //如果 mUpdate>=time,说明:更新序列帧之前的时间+序列帧两张间隔时间 大于等于 游戏内时间,需要等待游戏内时间继续增长,不用更新序列帧图片
        //这样做法可以最大程序上保证两张序列帧之间的间隔约等于 1/每秒播放帧数
        if (mUpdate < time)
        {
            mUpdate = time;

            //判断是正向播放还是倒序播放
            int newIndex = framerate > 0 ? frameIndex + 1 : frameIndex - 1;

            //判断 如果在不循环播放时
            //倒序播放 序列帧当前索引小于0,正向播放 序列帧索引大于序列帧总长度
            //则停止播放
            if (!isLoop && (newIndex < 0 || newIndex >= frames.Length))
            {
                enabled = false;
                return;
            }

            //判断序列帧索引是否越界
            frameIndex = RepeatIndex(newIndex, frames.Length);
            UpdateSprite();
        }
    }

    /// <summary>
    /// 更新序列帧图片
    /// </summary>
    void UpdateSprite()
    {
        float time = ignoreTimeScale ? Time.unscaledTime : Time.time;

        //每次更新序列帧图片时,将序列帧时间进行更新
        //新的序列帧时间为:当前游戏内时间+每两帧图片之间的间隔时间(间隔时间就是1秒/序列帧数量)
        mUpdate = time + Mathf.Abs(1f / framerate);

        //更新序列帧图片
        animImage.sprite = frames[frameIndex];
    }

    //用于判断序列帧索引是否越界
    public int RepeatIndex(int val, int max)
    {
        if (max < 1) return 0;
        while (val < 0) val += max;
        while (val >= max) val -= max;
        return val;
    }
}

以上是关于想给UNITY里面 加一个移动就播放声音的脚本,如何控制这个声音的开和关的主要内容,如果未能解决你的问题,请参考以下文章

unity动作技能绑定播放

unity3d的playmaker插件使用教程,对象出入触发,声音播放

a物体碰撞b物体,b物体发出声音music,这个如何用unity实现,代码怎么写

unity3d的playmaker插件使用教程,三对象出入触发,声音播放

unity怎么播放多个音乐

Unity模型添加旋转动画就变形,怎么回事?