셀의 Timeline에서 오디오 재생이 끝날 때까지 순환합니다.

17073 단어 Unity

입문


이것은 《유니티 부드러운 여름 이벤트 달력 2019》 첫날의 보도이다.이번에는 유니티의 타임라인에 대한 이상한 사용법을 소개하고 싶습니다.
Unity의 Timeline은 다중 궤도에서 공연 등을 제작하는 표준 기능으로 주로 게임 중의 영화 장면을 제작하고 장면을 편집하는 데 사용된다.표준 애니메이션과 달리 여러 자원을 동시 이동할 수 있기 때문에 코드를 거의 쓰지 않아도 복잡한 공연을 할 수 있다.
그렇게 뛰어난 타임라인, 하지만 기본적으로 그 이름은 시간 시리즈를 따라 공연이 주를 이룬다.하지만 내용에 따라 편집의 길이도 변할 수 있다고 생각합니다.그래서 이번에는 오디오 길이에 따라 재생 위치를 자동으로 조정하는 경로를 설치해 봤다.

대사를 다 읽을 때까지 순환해서 기다릴게요.


나는 이 자료고를 바꾸는 형식으로 만들었다.
참조: tsubaki/Timeline-Loop
블로그 삽입용 동영상pic.twitter.com/mgtmNskpSW-Nakaji Kohki/리향(@nkjzm)July 31, 2019


© UTJ/UCL
사운드 재생이 끝나기 전에 LoopClip 위에서 반복적으로 움직이는 모습을 확인할 수 있습니다p>

실시


거의 다 쓰바키씨지만 드문 기회라서 해설에서 소개합니다.p>
우선 타임라인의 기본 구성입니다.이미지로 TrackAsset라는 클립을 배치할 PlayableAsset 상자가 준비되어 있습니다.그리고 PlayableAsset의 위치에 맞추어 PlayableBehaviour의 생명주기가 돌아가는 느낌을 준다.PlayableBehaviour가 실행될 때 생성되므로 Hierarchy의 참조 등은 PlayableAsset부터 교차해야 합니다.


주로 3가지 스크립트로 나뉘기 때문에 언뜻 보기에는 복잡하지만 이동PlayableBehaviour을 위해 준비를 했다는 인상은 이해하기 쉽다.br/>
참조: Unity 2017의 Timeline 기반을 다져야 합니다. - 섭곡반의 통신.
다음은 계승된 이 반부터 소개하겠습니다.p>


LoopBehaviour.cs

using System;
using UnityEngine;
using UnityEngine.Playables;

[Serializable]
public class LoopBehaviour : PlayableBehaviour
{
    public PlayableDirector director { get; set; }
    public WaitTimeline waitTimeline { get; set; }
    public AudioSource audioSource { get; set; }
    public AudioClip audioClip { get; set; }
    public override void OnBehaviourPlay(Playable playable, FrameData info)
    {
        if (!audioSource.isPlaying)
        {
            audioSource.PlayOneShot(audioClip, 1);
        }
    }
    float timer = 0f;
    public override void PrepareFrame(Playable playable, FrameData info)
    {
        timer += Time.deltaTime;
        if (timer < audioClip.length)
        {
            return;
        }
        waitTimeline.trigger = true;
    }
    public override void OnBehaviourPause(Playable playable, FrameData info)
    {
        if (waitTimeline.trigger == true)
        {
            waitTimeline.trigger = false;
            return;
        }
        director.time -= playable.GetDuration();
    }
}


PlayableBehaviour 시간에 따라 몇 개의 함수를 호출합니다.이번 인상은 다음과 같다.p>


먼저 재생PlayableBehaviour 시 실행PlayableAsset에서 소리 재생p>
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
    if (!audioSource.isPlaying)
    {
        audioSource.PlayOneShot(audioClip, 1);
    }
}

다음OnBehaviourPlay()은 각 프레임이 불리는 함수로 시간의 측정을 거친다.또한 길이PrepareFrame()를 초과한 경우audioClipp>

public override void PrepareFrame(Playable playable, FrameData info)
{
    timer += Time.deltaTime;
    if (timer < audioClip.length)
    {
        return;
    }
    waitTimeline.trigger = true;
}

마지막trigger은 이름상으로는 상상하기 어렵지만 포즈를 취할 때뿐만 아니라 OnBehaviourPause()의 마지막 프레임에서도 호출할 수 있는 함수입니다.이 시점PlayableAsset이 사실입니다. 즉, 재생이 끝난 후 그대로 유지되고 종료되지 않으면 타임라인으로 돌아가는 시간입니다.p>

public override void OnBehaviourPause(Playable playable, FrameData info)
{
    if (waitTimeline.trigger == true)
    {
        waitTimeline.trigger = false;
        return;
    }
    director.time -= playable.GetDuration();
}

계승된 클래스에서

trigger의 참조를 실행합니다.Hierarchy에 대한 참조는 LoopBehaviourPlayableAsset, 즉 PlayableDirector 구성 요소가 있는 GameObject를 통해 얻을 수 있습니다.p>


LoopClip.cs

using System;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

[Serializable]
public class LoopClip : PlayableAsset, ITimelineClipAsset
{
    public ClipCaps clipCaps { get { return ClipCaps.None; } }

    [SerializeField]
    AudioClip audioClip = null;

    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
        var playable = ScriptPlayable<LoopBehaviour>.Create(graph);
        LoopBehaviour beheviour = playable.GetBehaviour();
        beheviour.director = owner.GetComponent<PlayableDirector>();
        beheviour.waitTimeline = owner.GetComponent<WaitTimeline>();
        beheviour.audioSource = owner.GetComponent<AudioSource>();
        beheviour.audioClip = audioClip;
        return playable;
    }
}


재생만CreatePlayable(PlayableGraph graph, GameObject owner)은 각각owner에 따라 다르기 때문에 AudioClip 검사기에서 지정한 형식을 사용합니다p>


마지막은 PlayableAsset배치PlayableAsset의 실현이다.이것은 단지 계승 PlayableAsset 을 통해 링크할 뿐이다p>


LoopTrack.cs

using UnityEngine.Timeline;

[TrackColor(1f, 0.2794118f, 0.7117646f)]
[TrackClipType(typeof(LoopClip))]
public class LoopTrack : TrackAsset
{
}


LoopClip 구성 시 팁


재생성 위치가 반복될 수 있으므로 재생성 중인 애니메이션이 자연스럽게 전환되지 않습니다.p>
이번에는 재생TrackAsset의 길이의 등배의 느낌으로 재생하여 전환 시 불협화감을 줄였다p>

마지막


원래 타임라인에서 소설 편집기 같은 것을 만들기 위해 검증을 시작했어요.나는 타임라인의 동적 연출과 길이가 다른 대사의 효과적인 관리를 겸비할 수 있다고 생각하지만 순환 중의 제한이 상당히 엄격하다는 것을 알아차렸다.동적 장점으로서 이외에도 외부에서 소리를 참조할 수 있는 형식, 사용자가 대사를 바꿀 수 있는 도구 등을 만들 수 있다.Default Playables를 사용하면 자막 등을 띄울 수도 있고, 의욕이 있다면 하는 것 같아요.p>
그런 느낌의 느슨한 기사입니다.내일《유니티 부드러운 여름 이벤트 달력 2019》@pCYSl5EDgo 씨의'LINQ to Native Array에 관한 글'입니다.기대해주세요.p>

좋은 웹페이지 즐겨찾기