Flutter로 게임 Part2를 해봤어요.
개시하다
처음 뵙겠습니다. 저는 평소에 Swift/Kotlin에서 iOS/Android 앱을 개발하는 엔지니어입니다.
Flutter는 이번이 처음인데 이런 느낌을 총괄해 보고 싶어요.
또 플utter는 주로 게임이 아닌 앱을 개발한다고 생각했는데 이번에는 특별히 게임을 만들어 봤어요.
이것은 슈크림이라는 복고풍의 간단한 횡사격 게임이다.
AppStore : https://apps.apple.com/us/app/id1527790378
GooglePlay : https://play.google.com/store/apps/details?id=jp.forestonegame.PekopekoShooting
어쨌든 Flutter는 처음이니까 구설수 있으면 봐주세요!
저번
지난번에는 주로
SpriteWidget
에 관한 이야기였다.이번에는 소리에 대한 얘기를 한번 해보고 싶어요!
사운드 재생
라이브러리
AudioPlayer
를 사용하여 사운드를 재생합니다.AudioPlayer
AudioPlayer
는 간단하지만 기능이 높은 음성 재생 라이브러리다.싱글 재생·순환 재생·일시정지·정지 기능은 물론 빠른 재생도 가능합니다!
다만, 게임에서 사용하는 구상에서 만들어진 것은 아닌 것 같고, 다양한 취미가 있기 때문에 이것과 함께 해설하고 싶습니다(·∀·)
간단한 처리
우선 간단한 처리를 설명하고 싶습니다.
일단 실례가 여기 생겼어요.
AudioCache _player = AudioCache();
1회 재생_player.play('sound/se/se.wav');
_player.play('sound/bgm/bgm.wav');
반복 재생_player.loop('sound/bgm/bgm.wav');
정지 또는 정지는 play
또는 loop
방법으로 되돌아오는 AudioPlayer
부터 시작한다.await로 불러야 하기 때문에 주의해야 합니다.
(이 일대는 개인적으로도 좀 불편하다.)
AudioPlayer audioSource = await _player.loop('sound/bgm/bgm.wav');
여기서부터 멈추거나 멈추세요.audioSource.stop(); // 停止.
audioSource.pause(); // ポーズ.
AudioPlayer의 매력
지금부터 게임의 함정을 설명해 드리겠습니다.
이것은 내가 게임 개발에 푹 빠진 곳이다.
SE의 재생성이 점점 뚜렷해지고 있어요.
어느 정도 게임 부분도 제작이 일단락됐을 때 SE는 바로 재생할 수 없었는데...잠시 후 재생현상이 많이 발생했다.
그리고 그 재생수는 증가할수록 현저하다.
나는 이때 메모리가 유출되었는지 걱정된다.
그래서 나는
AudioPlayer
의 이 부분을 매우 마음에 두고 있다.생성
AudioPlayer _player(PlayerMode mode) {
return fixedPlayer ?? new AudioPlayer(mode: mode);
}
audio_cache.dart
시 납품하지 않음AudioCache
fixedPlayer
하면 업데이트AudioPlayer
됩니다.견딜 수 없는 양
AudioPlayer
이 생겼을 수도 있다.나는 일어났는지 아닌지 추측했다.
이에 따라 오디오캐시가 생성됐을 때
fixedPlayer
도 설정을 시도했다.AudioCache _player = AudioCache(fixedPlayer: new AudioPlayer());
이렇게 하면 순조롭게 재생될 수 있다.하지만 이렇게 하면 SE재생이 반복될 때 이전 SE에서 도중에 끊어졌다.이것 괜찮아요?
따라서 SE 당 생성
AudioCache
을 결정합니다.Map _audioMap = Map();
_audioMap.addAll({
'sound/se/a.wav' : new AudioCache(fixedPlayer: new AudioPlayer()),
'sound/se/b.wav' : new AudioCache(fixedPlayer: new AudioPlayer()),
'sound/se/c.wav' : new AudioCache(fixedPlayer: new AudioPlayer()),
});
// ロードが必要か分からないが一応やっている.
_audioMap.forEach((key, value) {
value.load(key);
});
이 방법이 정확한지 모르겠지만 지금은 문제가 없습니다.이 내용은 대체로 이미 issue에 업로드되었다.
주의 사항
이것은 나 혼자 갔지만, 아직 그 대응이 정확한지 아닌지를 판단할 수 없다.
다만, 그쪽 발매에 먼저 대응하는 것이기 때문에 무책임한 안내는 아닌 점 양해 부탁드립니다.
또 고장이 나도 책임을 지지 않는다.
기술적인 기사에서 이런 일을 서술해서 죄송합니다.
BGM을 한 번에 틀면 안 돼요.
두 번째 함정.
통상 BGM은 순환 재생되는데 엔딩 BGM만 재생하고 싶어
play
방법으로 재생했는데 순환 재생이라니.이것도
AudioPlayer
의audio_cache.dart
방법과 play
방법의 비교loop
방법이면loop
player.setReleaseMode(ReleaseMode.LOOP);
.그래서
play
방법으로release 모드를 지정하면 된다고 생각합니다.Future<AudioPlayer> play(String fileName,
{double volume = 1.0,
bool isNotification,
PlayerMode mode = PlayerMode.MEDIA_PLAYER,
bool stayAwake}) async {
String url = await getAbsoluteUrl(fileName);
AudioPlayer player = _player(mode);
player.setReleaseMode(ReleaseMode.STOP); // added.
await player.play(
url,
volume: volume,
respectSilence: isNotification ?? respectSilence,
stayAwake: stayAwake,
);
return player;
}
이렇게 하면 순조롭다.아마도 이것도 사용fixedPlayer
의 영향으로 발생한 것일 것이다.loop
사용 방법 순환 재생 후releaseMode
유지ReleaseMode.LOOP
의 상태.이것은 issue에게 주는 마지막 나의 홍보 합병이다.
지금까지 소리를 재생하는 방법입니다.
도중에 많이 썼는데 기본적으로 간단한 API 사용이 편리한 프로그램 라이브러리입니다.
나는 이미 매우 많은 주의사항을 썼지만, 잘못된 접미사가 정확한지 모르겠으니 주의해 주십시오.
Flutter로 게임을 했는데 어때요?
Unity 및 Unreal Engine보다 낮은 결론을 내렸습니다.
SpriteWidget
자칭 게임 엔진이지만 솔직히 기능적으로 많이 부족했고 이번에 사용한 사운드 라이브러리Audio Player
도 게임 용도에 불안정했다.게다가 플루터의 스테이트를 중심으로 선언적인 UI와 게임의 조합도 상당히 어렵다.이 근처에서 아무 생각 없이 실시했기 때문에 힘들었어요.
게다가 더위를 게임 부분에 다시 끼우는 것도 좋지 않다.
따라서 종합적으로 고려해 플루터로 게임을 만들고 싶은 사람에게 추천할 수 없다.
2D 게임에서 제작하는 조건도 달았다.
///그렇지만, 아주 재미있게 놀았어요. 아이폰/Android 게임을 같이 할 수 있어서 역시 대단해요.다시 한 번 설계를 고려하여 실시하면 Flutter와의 호환성도 좋아질 것이다
그리고 무엇보다 게임으로 잘 나올 수 있어서 너무 즐거웠어요!
조금은 힘이 들어가지만 간단한 2D 게임이면 충분히 할 수 있어요.
덤
사실 OSS의 공약을 조금 의식한 건 처음이에요.
고장 자체가 비교적 빨리 발견되었기 때문에, issue는 비교적 빨리 만들어졌다.홍보에는 절차가 있었지만 인터넷에서 투덜거리며 다른 사람이 한 것을 참고했다.
지금 나는 정말 이런 경험을 쌓을 수 있어서 정말 좋다고 생각한다.
앞으로도 개인 개발에 힘쓰고 게임과 애플리케이션을 발표할 수 있기를 바랍니다
Reference
이 문제에 관하여(Flutter로 게임 Part2를 해봤어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/asteroid/articles/31104fc13cd19b256381텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)