想给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脚本的引用)
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里面 加一个移动就播放声音的脚本,如何控制这个声音的开和关的主要内容,如果未能解决你的问题,请参考以下文章
unity3d的playmaker插件使用教程,对象出入触发,声音播放
a物体碰撞b物体,b物体发出声音music,这个如何用unity实现,代码怎么写