티스토리 뷰

반응형



< 1. NatCorder Asset 이란? >

현재 제가 회사를 다니면서 쓰고 있는 유료 동영상 어플입니다. 이 어플의 Sample을 보면, SNOW 어플이나 Between 어플에서 꾸욱 누르면 녹화가 되고,

녹화 버튼을 떼면, 리플레이 영상이 나오는 형식의 에셋입니다.



< 2. RecordButton 스크립트 X , ReplayCam 스크립트 사용 >

- Natcorder를 사용하시는 분들이라면, RecordButton과 ReplayCam 스크립트가 어떤 건지는 아실거라고 생각하기 때문에, 편의상 namespace와 class는 제외 시켰습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
 /**
        * EventTrigger를 추가해서, 각각 버튼에 이 스크립트가 포함되어 있는 오브젝트를 넣어주고
        * 클릭 리스너로, StartRecording과 StopRecording 메서드를 사용해야 한다.
        */
        #region OBJECT_AND_VARIABLE
 
        // 있던 부분.
        public bool recordMicrophoneAudio;
        public AudioSource audioSource;
 
 
        // 추가 부분!
        public Text timeText;                                               // 00 : 00 으로 시간을 나타내 줄 Text 객체.
        public GameObject startRecButton, stopRecButton , recAnimation;     // 시작 버튼과 정지 버튼, 그리고 녹화중이라고 알려주는 Image의 애니메이션 객체.
        private bool recoding = false;                                     
 // recoding이란 변수를 만들어, 녹화중인가? 아닌가?를 알려준다.
        private const float MAX_RECORDING_TIME = 30f;                       // 최대 녹화 시간은 30초로 설정. AR을 녹화할 것이기 때문에, 과부하가 발생할 가능성이 크다.
        private float time = 0.0f;                                          // 현재 녹화되고 있는 시간 변수.
 
        #endregion
 
        #region UNITY_INTERNAL_FUNC
 
        /// &lt;summary&gt;
        /// 녹화중일 때만 실행이 되고, 최대 30초동안 녹화가 되면 녹화를 정지시키는 업데이트 함수.
        /// &lt;/summary&gt;
        private void Update()
        {
            if (recoding)
            {
                time += Time.deltaTime;
                timeText.text = string.Format("00 : {0}", time.ToString("00"));
                if (time &gt;= MAX_RECORDING_TIME)
                {
                    StopRecording();
                }
            }
        }
 
        #endregion
 
        #region USER_DEFINED_FUNC
 
        /// &lt;summary&gt;
        /// 녹화가 끝나면, 시간과 현재 녹화중이 아니라는 것을 알려주기 위한 초기화 메서드.
        /// &lt;/summary&gt;
        private void Reset()
        {
            time = 0.0f;                // 시간을 초기화 하고,
            recoding = false;           // 녹화중이 아니라는 것으로 변경한다.
        }
 
        /// &lt;summary&gt;
        /// 녹화를 시작했을 때, 녹화가 되었다는 것으로 변경하고, 녹화 버튼을 끄고, 녹화중에 필요한 오브젝트들을 킨다.
        /// &lt;/summary&gt;
        private void StartRec()
        {
            recoding = true;
            stopRecButton.SetActive(true);
            startRecButton.SetActive(false);
            recAnimation.SetActive(true);
            timeText.gameObject.SetActive(true);
        }
 
        /// &lt;summary&gt;
        /// 녹화가 종료됐을 때, 녹화에 필요한 값들을 초기화 하고, 녹화 버튼을 키고, 녹화중이 아닐 때 필요없는 오브젝트를 끈다.
        /// &lt;/summary&gt;
        private void StopRec()
        {
            Reset();
            stopRecButton.SetActive(false);
            startRecButton.SetActive(true);
            recAnimation.SetActive(false);
            timeText.gameObject.SetActive(false);
        }
 
        /// &lt;summary&gt;
        /// 녹화 시작 부분. 원래 있던 메서드.
        /// &lt;/summary&gt;
        public void StartRecording ()
        {
            StartRec();     // StartRec 메서드를 불러온다.
 
            // 있던 부분
            // Create a recording configuration
            const float DownscaleFactor = 2f / 3;
            var configuration = new Configuration((int)(Screen.width * DownscaleFactor), (int)(Screen.height * DownscaleFactor));
            // Start recording with microphone audio
            if (recordMicrophoneAudio)
            {
                StartMicrophone();
                Replay.StartRecording(Camera.main, configuration, OnReplay, audioSource, true);
            }
            // Start recording without microphone audio
            else
            {
                Replay.StartRecording(Camera.main, configuration, OnReplay);
            }
        }
 
        // 건드리지 않음.
        private void StartMicrophone ()
        {
            #if !UNITY_WEBGL || UNITY_EDITOR // No `Microphone` API on WebGL :(
            // If the clip has not been set, set it now
            if (audioSource.clip == null) {
                audioSource.clip = Microphone.Start(nulltrue6048000);
                while (Microphone.GetPosition(null&lt;= 0) ;
            }            
            // Play through audio source
            audioSource.timeSamples = Microphone.GetPosition(null);
            audioSource.loop = true;
            audioSource.Play();
            #endif
        }
 
        public void StopRecording ()
        {
            StopRec();          // StopRec 메서드를 불러온다.
 
            // 원래 있던 부분!
            if (recordMicrophoneAudio) audioSource.Stop();
            Replay.StopRecording();
        }
 
        void OnReplay (string path)
        {
            Debug.Log("Saved recording to: "+path);
            // Playback the video
            #if UNITY_IOS
            Handheld.PlayFullScreenMovie("file://" + path);
            #elif UNITY_ANDROID
            Handheld.PlayFullScreenMovie(path);
            #endif
        }
 
        #endregion
cs


제가 만들어놓은 것도 주석을 달아놨고, 또한 EventTrigger 라는 컴포넌트를 각각 startButton과 stopButton 객체에 추가를 해주어야 합니다.


Natcorder 에셋을 사용하시는 데, 저 처럼 어려움을 겪으신 분

들에게 도움이 되실만한 자료가 되었으면 좋겠습니다..


즐거운 코딩 되시길 바랍니다! 감사합니다!




- 이 글에 도움이 되셨다면, 밑에 공감(♡) 버튼을 눌러주시면 감사하겠습니다. -





반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함