Unity3D小游戏之八分音符ヾ(๑╹◡╹)ノ"

  emmmm,这是第一次写随笔,所以可能有些地方不清楚,或者比较啰嗦,清见谅(如果有人看我的随笔的话),话不多说,接下来进入我们的主题。

  

  首先分析一下八分音符这个游戏,它的核心功能就是通过声音的大小来控制角色的行走和跳跃,从而实现规避障碍物或者越过砖块之间的缝隙的功能,不断向前行走。那么这其中的关键就是截取音量并且获取其中每一小段音频的最大值,从而来根据音量的大小来实现行走或者跳跃或者静止的不懂功能。

  

  Unity中为我们提供了这样的方法,用一个string类型的变量来储存设备的麦克风,由于一个设备可能有多个名称,所以定义中是用的string数组。

  string device;

  device = Microphone.devices[0];//device[0]代表设备的默认麦克风

  设备找到了,我们接下来声明一个变量来储存音频

  public AudioClip mico;

  mico=Microphone.Start(device,true,100,44100);

  //这里用到了start方法,第一个参数是使用哪个麦克风,这里我们可以使用之前声明的device,第二个参数代表是否循环录音,打三个代表一段录音的长度,我们为了方便可以声明长一点(以免循环次数较多占用更多内存?我自己也不清楚,但是感觉时间长一点比较好(T▽T))。第四个参数为音频的音质,即采样率,一般的无损音质是44100,即每秒用44100个float来表示1秒的音频内容,但是我们的语音8000就够了,不然录制出来的音频特别大,不利传输。

  获取到一整段音频了,接下来我们要进行的就是取得其中每一小段音频的最大值了٩(๑❛ᴗ❛๑)۶

  声明一个变量来存储最大值

  float maxvolume = 0f;

  声明一个数组来存储一小段音频中每个节点的值

  float[] volumeData=new float[128];

  声明一个变量来获取麦克风的开始节点

  int offset = Microphone.GetPosition(device) - 127;//-128+1

  然后AudioClip.GetData方法可以将audilClip转化为float[] samples。

  mico.GetData(volumeData, offset);//这样就将音频中每一时刻声音的大小存储到数组中,接下来通过一次循环就可以找到最大值并且赋给之前声明的maxvolume

  至此,核心功能已经完成了一大半了,接下来要做的就是通过我们获取的这个最大值来执行行走或者跳跃的操作了。٩(๑>◡<๑)۶ 

  其实这部分的操作比较简单,我们首先可以自己测试一下自己的设备看一下获取的maxvolume的值得范围,比如我的设备最大值就是0.6左右(这个值的范围是0——1),那么我们就可以设置条件,当值大于0.2时向左行走,当值大于0.4时向上跳跃。(注意,这里是两个if,而不是一个if一个else if,因为在跳跃的时候也可以向前跳嘛,僵直的向上跳该有多蠢φ(>ω<*) )

 

void jump()
{
rg.AddForce(Vector2.up * 300 * volume);
}

void MoveForward()
{
rg.AddForce(Vector2.right * 20f);
}

 

  我们通过刚体组件给物体添加力来实现移动,这里的300和20是我通过测试得到的,不同的情况添加的力也不同,这里需要自己测试多大力合适。(~ ̄▽ ̄)~ 

  但是当我将这两个脚本写完后开始测试,发现了一个不小的bug,就是跳跃没有cd,当声音大的时候可以一直跳跃,从而达到了飞天的效果,这显然是不合适的,那么我们需要为跳跃设置一个cd。

float Temptime = 0f;

 

if(volume>0.4)
{
if(Time.time-Temptime>1.5)
{
jump();
Temptime = Time.time;
}
}

 

   我将cd设置为1.5S,每当当前时间减去Temptime大于1.5S时才能跳跃,然后将Time.time的值赋给Temptime,这样我们就完成了一次简单的cd。经过测试,核心功能已经基本实现了!ヾ(o´∀`o)ノ 

  接下来要完成这个小游戏就很简单了,设置一个主角,创建几个砖块,然后设置几个障碍物和一个重点就行了。

  障碍物的死亡判断和终点的胜利判断我都是通过Trigger来实现的

void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Player")
SceneManager.LoadScene(0);
}

  这里的死亡判断运用到了加载场景的方法,当主角触碰到障碍物时加载场景0,在Fire->Build Setting->Scenes In Build中可以设置本场景为0场景,这样就实现了死亡时重新开始游戏。//需要注意的是使用这个方法是必须添加头文件using UnityEngine.SceneManagement;

  其他需要注意的几点就是Collider一定要勾选Trigger选项,不然无法判断。然后两物体要发生碰撞,必须至少其中一个带有Rigidbody组件。再就是创建的项目是2D的方法一定要带2D,不然没效果。

  另外还有一点需要实现,摄像机跟随角色,摄像机的x坐标等于角色的x坐标,其他坐标保持不变。

  (如果角色在平面上出来移动过快或者过慢或者容易滑行不好控制可以给角色和砖块添加physic Material 2D来改变摩擦系数)

  恩,貌似一些基本功能都实现了!就酱,虽然最后的成品是一个比较智障的游戏,但是收获还是很多的,就酱!赛哟拉拉(ノ゚∀゚)ノ 

  (这里分享一下我做的智障游戏,可能做得不是很好,多多包涵)

    http://pan.baidu.com/s/1nuLJ25r,密码uhwm

  

 

  

  

 

posted @ 2017-08-26 14:29  久居深海冷不冷  阅读(573)  评论(0)    收藏  举报