유니티 스크립트
2015.08.24 23:31

구간 루프 음악 스크립트

조회 수 232 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
using UnityEngine;
using System.Collections.Generic;
using System;

/// <summary>
/// 구간 루프를 지원하는 배경음악 스크립트입니다.
/// </summary>
public class SectionLoopingMusic : MonoBehaviour
{
    #region Inspector
    [Space(8)]
    [SerializeField]
    [Tooltip("구간 루프를 적용시킬 AudioClip입니다.")]
    private AudioClip audioClip;
    [Space(8)]
    [SerializeField]
    [Tooltip("로딩후 바로 재생합니다.")]
    private bool playAfterLoad;
    [Space(8)]
    [SerializeField]
    [Tooltip("루프 섹션이 시작될 초단위의 지점입니다.")]
    private float loopSectionStartPoint;
    [SerializeField]
    [Tooltip("루프 섹션이 끝날 초단위의 지점입니다.")]
    private float loopSectionEndPoint;
    #endregion

    #region Member variable
    AudioSource audioSource;
    float[] audioBuffer;
    int position;
    int loopStartPoint;
    int loopEndPoint;
    #endregion

    #region Property
    /// <summary>
    /// 현재 AudioClip 인스턴스를 가져옵니다.
    /// </summary>
    /// <remarks>
    /// 현재 재생중인 AudioClip을 변경하려면 <seealso cref="Renew(AudioClip, float)"/>를 확인하세요.
    /// </remarks>
    public AudioClip AudioClip
    {
        get
        {
            return this.audioClip;
        }
    }
    /// <summary>
    /// 루프 구간 시작 지점을 가져옵니다.
    /// </summary>
    /// <remarks>
    /// 단위는 '초'입니다.
    /// 루프 구간 종료 지점을 가져오려면 <seealso cref="LoopSectionEndPoint"/>를 참조하세요.
    /// </remarks>
    public float LoopSectionStartPoint
    {
        get
        {
            return this.loopSectionStartPoint;
        }
    }
    /// <summary>
    /// 루프 구간 종료 지점을 가져옵니다.
    /// </summary>
    /// <remarks>
    /// 단위는 '초'입니다.
    /// 루프 구간 시작 지점을 가져오려면 <seealso cref="LoopSectionStartPoint"/>를 참조하세요.
    /// </remarks>
    public float LoopSectionEndPoint
    {
        get
        {
            return this.loopSectionEndPoint;
        }
    }
    /// <summary>
    /// 진행 시간을 가져오거나 설정합니다.
    /// </summary>
    public float TimePosition
    {
        get
        {
            return this.position / this.audioBuffer.Length * this.audioClip.length;
        }
        set
        {
            this.position = (int)(value * this.audioBuffer.Length / this.audioClip.length);
        }
    }
    /// <summary>
    /// 현재 버퍼의 위치를 가져오거나 설정합니다.
    /// </summary>
    public int Position
    {
        get
        {
            return this.position;
        }
        set
        {
            if (value < audioBuffer.Length || value >= 0)
            {
                position = value;
            }
            else if (value < 0)
            {
                throw new System.ArgumentException("Value is lesser then 0.");
            }
            else
            {
                throw new System.ArgumentException("Value is larger then AudioClip.Samples * AudioClip.chennels.");
            }
        }
    }
    /// <summary>
    /// 현재 <see cref="UnityEngine.AudioSource"/> 인스턴스를 가져옵니다.
    /// </summary>
    /// <remarks>
    /// <see cref="UnityEngine.AudioSource"/>에 직접 접근하는 것은 안전하지 않습니다.
    /// 배경 음악 재생에 필요한 기능들은 거의 이 스크립트에서 제공하고 있습니다.
    /// 정말 필요한 경우에만 제한적으로 접근하십시오.
    /// </remarks>
    [Obsolete("AudioSource에 직접 접근 하는 것은 안전하지 않습니다.")]
    AudioSource AudioSource
    {
        get
        {
            return this.audioSource;
        }
    }
    #endregion

    #region Related to audio
    #region Method
    /// <summary>
    /// 재생합니다.
    /// </summary>
    public void Play()
    {
        this.audioSource.Play();
    }
    /// <summary>
    /// 중지합니다.
    /// </summary>
    public void Stop()
    {
        this.audioSource.Stop();
        this.position = 0;
    }
    /// <summary>
    /// 일시중지합니다.
    /// </summary>
    public void Pause()
    {
        this.audioSource.Pause();
    }
    #endregion

    #region Property
    /// <summary>
    /// 음의 크기를 설정하거나 가져옵니다.
    /// </summary>
    public float Volume
    {
        get
        {
            return this.audioSource.volume;
        }
        set
        {
            this.audioSource.volume = value;
        }
    }
    /// <summary>
    /// 음의 높이를 설정하거나 가져옵니다.
    /// </summary>
    public float Pitch
    {
        get
        {
            return this.audioSource.pitch;
        }
        set
        {
            this.audioSource.pitch = value;
        }
    }
    /// <summary>
    /// 음의 좌우 위치를 설정하거나 가져옵니다.
    /// </summary>
    public float Pan
    {
        get
        {
            return this.audioSource.panStereo;
        }
        set
        {
            this.audioSource.panStereo = value;
        }
    }
    #endregion
    #endregion

    #region Script control
    /// <summary>
    /// AudioClip과 루프 구간을 갱신합니다.
    /// </summary>
    /// <param name="audioClip">새 AudioClip 인스턴스입니다.</param>
    /// <param name="loopSectionStartPoint">새 루프 구간 시작 지점입니다. 단위는 '초'입니다.</param>
    /// <param name="loopSectionEndPoint">새 루프 구간 종료 지점입니다. 단위는 '초'입니다.</param>
    public void Renew(AudioClip audioClip, float loopSectionStartPoint, float loopSectionEndPoint)
    {
        this.audioSource.Stop();
        // 할당
        this.audioClip = audioClip;
        this.loopSectionStartPoint = loopSectionStartPoint;
        this.loopSectionEndPoint = loopSectionEndPoint;

        // 지역변수는 멤버변수보다 빠름.
        var channelCount = this.audioClip.channels;

        // 버퍼에 대한 루프 시작점을 연산해둔다.
        this.loopStartPoint = (int)((this.loopSectionStartPoint / this.audioClip.length) * this.audioClip.samples * channelCount);
        this.loopEndPoint = (int)((this.loopSectionEndPoint / this.audioClip.length) * this.audioClip.samples * channelCount);

        // 오디오 버퍼를 생성한다.
        this.audioBuffer = new float[this.audioClip.samples * channelCount];
        this.audioClip.GetData(audioBuffer, 0);

        // 제어할 AudioClip생성. 이후에는 audioClip에 접근하지 않는 것이 좋음.
        this.audioClip = AudioClip.Create(this.audioClip.name + "_loop", this.audioClip.samples, channelCount, this.audioClip.frequency, true, this.AudioRead);

        if (this.loopSectionEndPoint < this.loopSectionStartPoint)
        {
            this.loopSectionEndPoint = this.audioBuffer.Length;
        }

        this.audioSource.loop = true;
        this.audioSource.clip = this.audioClip;
        this.position = 0;
        if (this.playAfterLoad)
            this.Play();
    }
    /// <summary>
    /// 스크립트 초기화시 호출됩니다.
    /// </summary>
    /// <exception cref="System.NullReferenceException">
    /// AudioSource를 찾을 수 없을 경우 발생합니다.
    /// </exception>
    public void Start()
    {
        // AudioSource 컴포넌트 가져오기.
        this.audioSource = GetComponent<AudioSource>();
        if (audioSource == null)
        {
            throw new System.NullReferenceException("Not found AudioSource component.");
        }

        this.Renew(this.audioClip, this.loopSectionStartPoint, this.loopSectionEndPoint);
    }
    void AudioRead(float[] buffer)
    {
        var dataLength = buffer.Length;
        int bufferPosition = this.position;

        for (int i = 0; i < dataLength; i++)
        {
            buffer[i] = this.audioBuffer[bufferPosition];
            bufferPosition++;
            if (bufferPosition >= this.loopEndPoint)
            {
                bufferPosition = this.loopStartPoint;
            }
        }
        this.position = bufferPosition;
    }
    #endregion

}

시작후 알아서 이 스크립트 얻어내서 Play 메서드 호출시키시면 됩니다 ^^

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수 추천 수
108 RPGMV 플러그인 Mouse System Ex 마우스 입력 시스템 파란별빛 2015.10.30 859 0
107 RPGMV 플러그인 Bind Pictures To Map (이미지 결합 플러그인) 3 file 이녕 2015.10.30 1049 0
106 RPGMV 플러그인 EnemyBook v1.1 - SkottyTV Update(몬스터북 플러그인) plam 2015.10.27 1006 0
105 RPGMV 플러그인 날씨효과를 전투중에도 사용하는 플러그인입니다. 3 plam 2015.10.27 839 0
104 RPGMV 플러그인 MKMV_SaveManager (심플 세이브 & 세이브 슬롯 확장) 2 file 최빛빛 2015.10.27 912 1
103 RPGMV 플러그인 현실 시간 변수 대입 플러그인 2 file 최빛빛 2015.10.26 602 1
102 RPGMV 플러그인 [JS] 세이브 갯수를 20개에서 변경하기. 천무 2015.10.26 508 0
101 RPGMV 플러그인 맵타일 크기 변경 플러그인! 1 파란별빛 2015.10.26 1398 0
100 RPGMV 플러그인 프리로드 매니저 (소재를 미리 불러서 게임진행을 빠르게) 파란별빛 2015.10.26 695 0
99 RPGMV 플러그인 타이틀 커맨드에 '게임종료'를 추가해줍니다. file 파란별빛 2015.10.26 114021 0
98 RPGMV 플러그인 회전하는 타이틀 메뉴 플러그인 1 file 파란별빛 2015.10.26 839 0
97 RPGMV 플러그인 RPG MV 와 AJAX를 이용한 웹 통신 플러그인 파란별빛 2015.10.26 546 0
96 RPGMV 플러그인 배틀미스트(전투중포그효과) 플러그인 file 파란별빛 2015.10.26 545 0
95 RPGMV 플러그인 RPG Maker MV 한글 데이타베이스 입니다. 9 file 천무 2015.10.25 1903 3
94 RPGMV 플러그인 Ellye's Simple ATB (RPG Maker MV) 2 file 파란별빛 2015.10.24 1245 1
93 RPGMV 플러그인 한글 이름 입력 처리 플러그인 1 file 파란별빛 2015.10.24 1668 0
92 RPGMV 플러그인 전투속도 고속화 플러그인. 1 file 파란별빛 2015.10.24 1097 0
91 RPGMV 플러그인 한국어 조사 (은/는/이/가) 처리 플러그인 입니다. 2 file 파란별빛 2015.10.24 1037 0
90 RPGMV 플러그인 해상도 변경 플러그인 v0.1 4 file 카리스 2015.10.24 5689 2
» 유니티 스크립트 구간 루프 음악 스크립트 맛난호빵 2015.08.24 232 0
Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 15 Next
/ 15






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)