unity shader——特效与音乐相结合

特效与音乐的结合,也并没有太大难度,特效部分提供一些可控接口,音乐部分提供波谱数值即可。

第一步非常好实现,国内这块儿的资料还是比较多的。

第二步看起来难,实际上过来人点一点,就透亮了。

在unity中,不需要再实现获取即时音乐数据之类麻烦的底层代码了,使用这个函数:

技术分享(unity圣典,能看懂英文部分尽量看英文,汉化估计是直接拿软件翻过来的)

这个函数的用法是在每个 UPDATE 函数内部取样,它会自动从当前播放到的位置取,具体参数设置可以参照unity圣典。

百说不如一做,代码放一下:

using UnityEngine;
using System.Collections;

public class lightController : MonoBehaviour {

    public Renderer light1, light2, light3, light4;

    public float dumpX=0.3f, dumpY=0.3f, dumpZ=0.3f;

    // 采样宽度
    public int sampWidth = 128;
    public float scaleAmount = 4;


    private float[] specTrum;


    // Use this for initialization
    void Start () {

    }
    
    // Update is called once per frame
    void Update () {

        specTrum = audio.GetSpectrumData(sampWidth, 0, FFTWindow.BlackmanHarris);

        float totalValue = 0;
        int i = 0;
        while (i < sampWidth)
        {
            totalValue = totalValue + specTrum[i];
            i++;
        }

        dumpZ = totalValue*scaleAmount;

//        light1.material.SetFloat ("_DampZ", dumpZ);
//        light1.material.SetFloat ("_DampX", dumpX);
        light1.material.SetFloat ("_DampY", dumpY);

//        light2.material.SetFloat ("_DampZ", dumpZ);
//        light2.material.SetFloat ("_DampX", dumpX);
        light2.material.SetFloat ("_DampY", dumpY);

//        light3.material.SetFloat ("_DampZ", dumpZ);
//        light3.material.SetFloat ("_DampX", dumpX);
        light3.material.SetFloat ("_DampY", dumpY);

//        light4.material.SetFloat ("_DampZ", dumpZ);
//        light4.material.SetFloat ("_DampX", dumpX);
        light4.material.SetFloat ("_DampY", dumpY);
    }
}

关于shader的内容,可以参照这篇:
http://www.cnblogs.com/SecretMan001/p/4521437.html

OK了,看过代码之后你就会明白了,答案如此简单。

共勉!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。