Unity「きつねくん森へいく」ゲーム、完成目前で落とし穴が!音が出ない!(備忘録として)
昨日の夜は9時過ぎころから、いよいよ、「きつねくん森へいく Chapter1」をUnityroomにアップしようということで、栃木のぽんさんと東京のこんがLINEビデオ電話で話しながら、作業を始めた。
アップの前のラストタッチ、ちょっと気になるところを数か所手直ししてからアップしようという流れになり、ふたりで確認しながら一つずつ修正することに。(実際にアップする完成版はぽんさんのパソコンに入っているプロジェクトを使うつもり)
1.
迷路のマップで目的地がどの辺なのかをある程度、示しておかないとどっちに向かうのか、わかりにくいので、方向を示す道しるべを立てる。
2.
迷路のスタート地点できつねくんがひっかかって一歩踏み出せない箇所があるので、タイルをチェック。要らないタイルは外す。
3.
タイトルシーンの音楽が、前奏が長いので、前奏部分をカットして、メロディのところから始まるようにする。
👆の3点を直したら、公開だね!
と楽しみにいしていたのだが・・・・・
3番の音のところでとんでもないハプニングが!(@_@;)
もともと付けてあったAudio Clipはアセットストアやネットから探してきたもので、どれも私たちのゲームの雰囲気を盛り上げてくれる素晴らしい共演者だ。中でもタイトルシーンのBGMは気に入っているものだったのだが、スタートしてからメロディが流れるまでにゲームを始めてしまうと、いいところを聞かないままになってしまうのが、残念だったので、頭の部分をカットしようとこんが考えついた。
そこで、ネットで探した無料音編集ソフト「Audacity」をインストールして、これで頭の部分をカットした。それを「ogg」というファイル形式(この形式はUnityでもサポートされている、mp3よりもむしろ優れているところも多いと書かれていたので)で書き出した。それをまたUnityのきつねくんゲームのプロジェクト内にインポートすればよいと考えた。
こんがやってみたところ、期待どおりに短くできたので、栃木のぽんさんにも、手順を教えて、同じようにやってみて、と勧めた。
ところが、実際にこれをUnityに戻してから、ゲームを再生してみると、ボリュームが異常に小さく、思っていた結果とは違うことに気づいた。
元のオーディオクリップがどのくらいのボリュームだったのか、聞いてみようとしたところ、なんとそっちも以前とは違ってかすかにしか聞こえない。
原因を追究すべくあちこちをチェック。
ミュートボタンを押していないか調べたところ、自分では押していないのに、再生すると自動的にミュートボタンが有効になってしまうことを発見。(あとでこれは普通のことだと気づくが)
音源のインスペクターで音を聞いてみようとしてもそれも聞こえない。
プロジェクトセッティングの中のAudioの設定の中もネットで調べた箇所をチェックしてみた。そこにも問題はなさそう。
そうこうするうちに、このAudioClipだけでなく、ゲーム内のすべての音が聞こえなくなっていることに、二人は気づいた。
他のProjectではどうかを調べるとUnityHubに出ているほかの制作済みゲームも音が聞こえなくなっていた。(ぽんちゃんごめんよ( ;∀;)トラブルに巻き込んでしまって・・)
バージョンによってこの症状がでているのか?
Unityのバージョンが2021.3.5fで作ったものは、全部同様の症状がでていることが判明。
もっと古い2020.3.25などで作った作品は無傷であることがわかった。
そこから、こんはHubを再インストール。
そして、2021.3.5fがトラブルの元かもしれないと思ったので、更に新しい別のバージョンで開いてみたらどうか?試してみることに。
2021.3.9fをインストールして、さっきの音が聞こえないプロジェクトを恐る恐る開いてみる。
あ~~~~!嬉しい!
これはちゃんと音が出る。
ここまでの出口の見えない作業をしている間に時計は朝の4:30に。
(お互いに老骨に鞭打ってなにをやってんだか・・)
途中で万事休すになって、やったことのないQiitaでも初の質問なども投稿したりしたが(まだ回答はないから、何が原因だったのかはわからないままではあるが)何とか窮地は脱して、元の音つきのゲームが再現できることになった。やれやれ。
わたしがちゃんとうまくいくことを確認せずにぽんさんに同じことをやってもらったことは反省だ。栃木のパソコンでも、東京のパソコンでも、同時に同じトラブルが発生してしまうと、万事休すになることも体験してみて、危うさを痛感した。
これで、今日中には公開の運びとなるはず。
(こん)
「きつねくん森へいく」Chapter1 完成!!
このゲームは
主人公のきつねくんが
触るとやけどをしてしまう
危険な胞子をとばしてくる植物の生い茂る
「まっくら森」の迷路をくぐりぬけて
森の奥に住むたぬきさんに会いに行くゲームです。
数か月前にふいに思い立って
【MYMY工房】を復活させたい‼‼となってから
紆余曲折を乗り越えてたどり着いた第一作(厳密にいうと2作品目だけど...)
今までの経過を自分たちの記録としてここに整理しておこうと思います。
◆まず初めにUnityを理解するためUnitylearnのチュートリアルで勉強しました
(主に①ルビィの冒険と②Ellenのアクションゲーム)
◆ごく初心者向けのチュートリアルがありがたかったRuby’sAdventureを背骨にゲームを作ることにしました。
◆MYMY工房への思い入れが強かったので(主に「ぽん」の方が)絵本的のようなほのぼのテイストのしっかり作りこんだゲームにしたいと考えていました。
◆Rubyのチュートリアルをもとに展開するため、話の筋があるような無いようなゲームになりそうなところに抵抗を感じ大筋を考えました。
◆森の乱開発で怒った森の木々がゾンビとなって襲ってくる怖い森を何とかしなくては!というたぬきに協力してきつねが立ち上がるゲームにすることにしました。
◆そのころになるとチュートリアルの勉強ももう一段深いところまで掘り下げられるようになっていたので、もう一つのチュートリアルEllenのゲームを分解して解析してみました。
◆Ellenさんの薄暗い舞台にポッポッと薄暗い明かりがともるあの世界観に惹かれ薄暗い森に蛍をとばしてみたい!となり
◆森を一つ増やそうとなって、スタート地点から蛍に当たらないように迷路を進みゴールを目指す『まっくら森』のゲームをつくることにしました。
◆二つの森のゲームを作ることになったので2つのゲームを物語風につなげる展開が欲しくなりました。
◆まず表紙→きつねくんが活躍するに至る話の内容の説明ページ(分厚い本のような)→『まっくら森』で迷路ゲーム→ゴールの水車小屋でたぬきに出会う→たぬき特製薬を渡されてゾンビ退治の依頼を受ける→『花さき森』へ→その薬をかけてやると怒れる木のお化けゾンビは美しい花の咲く木に変身→すべてのゾンビを鎮めると→森全体がパッと明るくなって満開の花の森に‼‼‼
◆ゲームクリアした後はきつねくんは花さき森の中を自由に歩き回ることができて水車小屋にも入れるようになり川辺で魚釣りもします
◆何面かのゲームをかいくぐってたどり着く先はやっぱり乱開発と戦うラスボス戦も考えなくちゃねぇ
というようにしつこいほどの内容に固執して頑張って作りました
が
一回目のビルドの後
Uityroomを覗きに行って
他の方々の新着ゲームをプレイしてみてやっと気づいたことが
さぁ!ゲームをやってみようと思って
人のゲームをプレイしてみて、説明文がかったるいのはめんどくさいと思ってる自分がいる(笑)
まず表紙から次のページに進んでそこで長々と物語を読んでみる気持ちには絶対にならない
どんなに丁寧に説明したところでおそらく誰も読まないよね
それからミニゲームとしては単純すぎる?
少なくとも中毒性はないなぁ
さて今後どうする?
いまは暗中模索真っ最中です
そんなこんなで
今回
まずは『まっくら森』の迷路ゲームを
☆かったるい説明ページをはずし簡潔に必要最低限の文字情報のみとして
『きつねくん森へいくChapter1』を発表することにしました。
次回は
いよいよ本編『花さき森』のシューティングゲームを
『きつねくん森へいくChapter2』として発表する予定です。
もちろん
☆かったるい説明ページをはずし簡潔に必要最低限の文字情報のみのページをつけて
今後きつねくんは『海へ』行ったり『空』に行ったり『洞窟』…
いろんなところに行って活躍させたい
そんな風なことを考えていると
やっぱり楽しくて仕方ないのです
いろんな冒険ゲームができた暁には
総まとめに
改めて表紙をつけ物語のページも整え読み応えのある絵本でも読んでいるような
宝物のようなゲームができたらいいなぁ~
MYMYぽん(記)
*1:ここに脚注を書きます
KitsuController.csをどう書き換えてスマホバージョンにしたのか。備忘録として。
WebGL用に作った「きつねくん森へいく」ゲームのKitsuController.csをジョイスティックで動かせるように、アレンジした。元は変数moveとなっていたところを、全部
joystickMoveVector に入れ替えてみたところ、おおむね上手くいった。
赤文字👇の部分があたらしく挿入したジョイスティック用のコード。
緑文字の部分はコメントアウト。
きつねくんが左向きに歩くときに、アニメーションが右向きのままになってしまうのが、これから修正を必要とするところ。何が問題なのかを、探らなくては。(こん)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class KitsuController : MonoBehaviour
{
https://solitude-bocchi.com/unity/move/post-905で学んだジョイスティックのためのスクリプト
public Joystick joystick; //インスペクターにプレファブの『Fixed Joystick』を指定。
Vector3 joystickMoveVector; //ジョイスティックの傾き度を取得
public GameObject KitsuFishingPrefab;
public float speed = 3.0f;//これは不要か?
public int maxHealth = 5;
public GameObject projectilePrefab;
public int health { get { return currentHealth; } }
int currentHealth;
public float timeInvincible = 2.0f;
bool isInvincible;
float invincibleTimer;
Rigidbody2D rigidbody2d;
// float horizontal;
//float vertical;
Animator animator;
Vector2 lookDirection = new Vector2(1, 0);
AudioSource audioSource;
public void PlaySound(AudioClip clip)//木人や光の胞子に当たった時のキュン音
{
audioSource.PlayOneShot(clip);
}
// Start is called before the first frame update
void Start()
{
rigidbody2d = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
currentHealth = maxHealth;
// Debug.Log(currentHealth);
rigidbody2d = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
currentHealth = maxHealth;
audioSource = GetComponent<AudioSource>();
}
// Update is called once per frame
void Update()
{
joystickMoveVector = Vector3.right * joystick.Horizontal + Vector3.up * joystick.Vertical;
if (joystickMoveVector != Vector3.zero) //ジョイスティックを動かすと動く。
{
transform.Translate(joystickMoveVector * joystickMoveSpeed * Time.deltaTime, Space.World); //ジョイスティックの傾き度で動くスピードが変わる。
}
}
//horizontal = Input.GetAxis("Horizontal");
// vertical = Input.GetAxis("Vertical");
// Vector2 move = new Vector2(horizontal, vertical);
//以降、moveの代わりに joystickMoveVectorを代入した。
if (!Mathf.Approximately(joystickMoveVector.x, 0.0f) || !Mathf.Approximately(joystickMoveVector.y, 0.0f))
{
lookDirection.Set(joystickMoveVector.x, joystickMoveVector.y);
lookDirection.Normalize();
}
animator.SetFloat("Look X", lookDirection.x);
animator.SetFloat("Look Y", lookDirection.y);
animator.SetFloat("Speed", joystickMoveVector.magnitude);
if (isInvincible)
{
invincibleTimer -= Time.deltaTime;
if (invincibleTimer < 0)
isInvincible = false;
}
if (Input.GetKeyDown(KeyCode.C))//ここはスマホゲームではCキーでなくシューティングボタンをクリックに変える
{
Launch();//小瓶を投げるという関数
}
/* if (Input.GetKeyDown(KeyCode.X))
{
RaycastHit2D hit = Physics2D.Raycast(rigidbody2d.position + Vector2.up * 0.2f, lookDirection, 1.5f, LayerMask.GetMask("NPC"));
if (hit.collider != null)
{
NonPlayerCharacter character = hit.collider.GetComponent<NonPlayerCharacter>();
if (character != null)
{
character.DisplayDialog();
}
}
}*/
}
/* void FixedUpdate()//キー操作によるキツの移動
{
//Vector2 position = rigidbody2d.position;
//position.x = position.x + speed * horizontal * Time.deltaTime;
//position.y = position.y + speed * vertical * Time.deltaTime;
//rigidbody2d.MovePosition(position);
// Debug.Log("現在の体力は" + currentHealth);
}
*/
public void ChangeHealth(int amount)//ゾンビに当たるとライフが減る
{
if (amount < 0)
{
if (isInvincible)
return;
isInvincible = true;
invincibleTimer = timeInvincible;
}
currentHealth = Mathf.Clamp(currentHealth + amount, -1, maxHealth);
// Debug.Log("現在の体力は" + currentHealth);
if (currentHealth == 0)
{
//Debug.Log("体力ゼロ");
GotoGameOverScene();//体力がゼロになったらゲームオーバーシーンへ。
}
UIHealthBar.instance.SetValue(currentHealth / (float)maxHealth);
}
public void GotoGameOverScene()
{
SceneManager.LoadScene("GameOverScene");
}
public void Launch()//他のスクリプト、例えばShootingButtonからこの関数を取得するためにpublicを付けたほうがよいのかなと、思ってpublicにしてみた。
{
GameObject projectileObject = Instantiate(projectilePrefab, rigidbody2d.position + (Vector2.up * 0.5f), Quaternion.identity);
Projectile projectile = projectileObject.GetComponent<Projectile>();
projectile.Launch(lookDirection, 300);
animator.SetTrigger("Launch");//アニメーションを投げる動作にする
}
//FishingEreaに入ったらkitsuを消して、fishingKitsuを生成するという関数
void OnTriggerEnter2D(Collider2D other)
{
//Fishing = GameObject.FindGameObjectWithTag("Fishing");
if (other.CompareTag("Fishing"))
{
Destroy(gameObject);
Instantiate(KitsuFishingPrefab, transform.position, transform.rotation);
}
}
お~~~~!!!!Androidの実機に自作のゲームが現れた(^_^)v
「きつねくん森へいく」スマホバージョン。
遂に、自分のスマホをパソコンに繋いでの実機テストの運びとなった。
昨日からスクリプトやボタンなどをスマホ用に手直しして、まずはGame画面で再生。
ジョイスティック(バーチャルのね)もちゃんと作動するし、ちょっとスクリプトで手間取ったきつねくんが小瓶を投げるためのボタンも、押したらちゃんときつねくんが投げてくれるのを確認できた。
ただし、ボタンは間に合わせの適当なものだから、見た目はイマイチ。
そして、左上に配置したライフゲージも位置を動かしたりしているうちに、マスクがずれてしまったのか、ライフの赤玉が一緒に縮んでしまうという変なことになってはいるが、これは後日、ぽんさんに直してもらおう。
ということで、いよいよ、スマホをパソコンに接続。(Amazonでも頼んだけど、気がはやるので、近所の100均で買ってきたケーブルで接続。今日はすんなり認識されて100均上等!)
でもただ繋ぐだけではなく、そのまえにやることが・・・?
https://miyagame.net/unity-real-machine-android/
👆こちらのサイトを参考にさせていただいた。
スマホの側でも設定しなくてはいけないことがあるのか!!
「開発者モード」をONにする・・・なんか一つ階段を上ったような実感(^_^)
(因みにテスト終わってスマホの接続を外すときは、開発者モードをオフにしておいた。端末を開発者モードにする・解除する - StraightApps.com)
記念すべき実機での初テスト、記録しておかなくては!
スマホの動画キャプチャーカメラを回す。
UIのテキストが小さくて読めない、ボタンが小さくてなんのボタンかわからない、たまにきつねくんのアニメーションがおかしくなる(後ずさりすることがある)など、問題点はいくつか見つかったが、スマホでもプレイできるということは分かった。
何年も前からスマホで遊べるゲーム作りたいな・・と夢のように思っていたのが、そろそろ現実のものとして見えてきた!あと一息。(こん)
スマホ用に変換しよう!その2
Simulatorなるものがあることがわかり、いろんな端末でどんな感じになるのかはわかるようになって、一歩進んだわけだが、次の問題は、
1.タッチパネルでどうやって、きつねくんを動かすか。
2.どうやって小瓶を投げるができるのか。
パソコンで遊ぶのとはそこが違うところ。そして
3.キャンバスのサイズも端末の画面に合わせなくてはならない。
こんなことを知りたくて、昨日からずっとネットサーフィンしながら、いい情報を探していたが、いろんな方たちが情報を提供してくださっているのを、あれこれ試してみた。
Unityの画面のアスペクト比と解像度を自動変換 全スマホ・複数解像度に対応させる | Unity入門の森 ゲームの作り方 (3dunity.org)
仕組みはなんとなくわかったが、難しい(*´▽`*)
まだ納得できたわけではなく、まだモヤモヤが。
【Unity基礎】スマホ向けゲームUIの作り方!基本的なUI配置から複数解像度対応まで解説 - 渋谷ほととぎす通信 (shibuya24.info)
こちらのサイトもこれまで、うろ覚えだったアンカーとピボットのことを説明してくださっていて、UIを制するためには、これは必須と感じた。
Unityでアプリの画面サイズとスケーリングの設定方法 | Liibercraft|リーベルクラフト
このサイトで、キャンバスがシーンの画面にぴったり乗っかって表示されるやり方がわかり、キャンバスがずれることがなくなった。助かった。ただ、UIのテキストがシーンのオブジェクトの裏に隠れてしまって戸惑ったが、これはOrderInLayerの数を大きくしたら、すっきり解決!
ここまでで、ほぼ画面のサイズはなんとなく行けそうな雰囲気になってきた。
あとは、どうやってきつねくんを動かすのか・・・・
左右矢印を押すという方法を紹介しているサイトもあったが、きつねくんは上下左右に自由に動かしたい。タッチでそれをどうやって解決するのかと、悩んでいたら、ジョイスティックというアセットがあるらしいことが分かった。でも、これは3D用のものなのか、どうなのか・・と思っていたら、まさに知りたいことを教えてくださっているサイトにたどり着いた。
移動 | ぼっちはぼっちなりに冒険 (solitude-bocchi.com)
ジョイスティックのダウンロードの仕方から、使い方、貼り付けるスクリプトまで紹介されていて、まさに欲しい情報!早速やってみたところ、いい感じ。
そして、おそるおそるGame画面を再生してみたところ、ジョイスティック(赤い丸に変更してみた)の矢印をマウスでなぞるときつねくんが滑らかに(はじめはオズオズと、そしてヌルヌルと)動き出した。感動!(*^_^*)
今日はAndroidの実機がうまくパソコンに接続できなかったので、実機では試せなかったが、USBケーブルをAmazonで注文したので、明日にはテストできるはず。
そうなれば、あとはスクリプトなどを調整して、きつねくんが小瓶を投げるためのボタンを配置して。。。「きつねくん森へいく」のスマホバージョンが完成する日も近い。
(こん)
WebGLで作った「きつねくん森へいく」をスマホ用ゲームに変換しよう!
「きつねくん森へいく」のUnityファイルをデスクトップに複製。
これに手を加えてなんとかスマホ用にならないかと試してみることにした。
1.BuildSetteingでPlatformをAndroidに変更
2.Unityエディターにもどり、Gameの画面サイズを変更
と思ったが、教科書(Unityの教科書 北村愛実著)に出ているのと様子が違う。
ここにはiPhoneのバージョンごとのアスペクト比など選べる選択肢がない!
きつねくんは横長画面なのにGame画面は縦長のまま・・・・
3.あれこれ触っているうちに、Gameのタブの横の下向き▼を押すと、Simulatorに
切り替わることが分かった。ここにはいろなん端末の選択肢が表示されるし、その
端末を回転させるとどうなるかもシミュレーションしてみられる。これは便利!
なんだか、だんだんやれそうな気分になってきた。
スマホやタブレットで遊べれば、孫たちにも「きつねくんゲーム」を遊ばせることもできると思うと楽しみだ。でもセーフエリア(黄色い枠)を出してみると、iPadAir2の方は、少し画面が切れてしまうようだ。これは修正の必要あり。
でもそれ以前に、パソコンではキーボードの上下左右キーで歩かせていたきつねくんを
スマホ上ではどうやって歩かせるのかを考えなくては。クリックはそのままでスマホのタップに相当するらしいが、キー操作でやってきたきつねくん、どうやるのかな?
そして、小瓶を投げる動作はCキーを押すことになっているが、それもスマホだとどうなるのか・・・どうやれば楽に操作できるのか、スクリプトから書きなおす必要があるのやらないのやら?できれば、シーン上にボタンとか配置せずに遊べるほうがいいと思うが、動かしながらシューティングって、できるかな?
その辺、明日からまた研究しなくては! (こん)
Unityroomに公開したあとにやるのは、スマホ対応に変換すること!
UnityroomはWebGL形式のものでないと受け付けてもらえないので、今回の「きつねくん森へいく」ゲームは、とりあえずWebGLで作り、ビルドした。
Unityroomへもアップ。
https://unityroom.com/users/q9rflxihjs7ngwo1tabk
これを今度はスマホでも遊べるように変換したい。
いままでスマホゲームは作ったこともなく、調べてきたネットのサイト、読んだ本もおみんなパソコンで遊ぶのを前提としているものだったので、スマホ用のゲームの作りからは、またゼロから勉強だ。
前に買っていた「Unityの教科書 Unity2017完全対応版」2D&3Dスマートフォンゲーム入門講座(SBCreative出版)(この前本屋でみたらこれの最新版2022が出ていた)
https://www.amazon.co.jp/dp/4815617155/ref=cm_sw_r_tw_dp_RW8EKRG9Q3N1WM1661ZN @amazonJP
これが持っている唯一のスマホ用に特化した本なので、これを頼りにやってみる。
まずやることは、
1.JDKのインストール
2.AndroidStudioのインストール
とある。
この二つをやるのに、結構時間がかかってしまった。
参考にさせて頂いたサイトはここなど👇
Javaで必要なJDKとは?JREとの違いやインストールの手順を8つ解説 | Javaコラム (fenet.jp)
Windows10にJavaをインストールする手順|3つのメリットとは? | Javaコラム (fenet.jp)
実際にやってみるとこれらのサイトの解説の時から、現在までに変更もあったのか、ダウンロードサイトのバージョンの表示が違っていたりして、迷う場面もあったが、適当に選んでダウンロード、そしてインストール、などやってみた。多分ちゃんとできたとは思うが、結構ややこしかったので、ワンステップごとにスクショを残しておいた。
いずれ近日中にぽんさんが同じことをやるだろうから、その時まで忘れないための備忘録として。
ゲームの構想を練ったり、シーンを作る作業は夢があって楽しいが、こういう下準備の作業は正直なところ、粘り強いわたしでも面倒くさい。でも、これをなくして、スマホゲームも作れないと思うと、頑張るしかない!
これがちゃんとできていたとして、次にやることは、「きつねくん森へいく」プロジェクトをスマホ向きにすることなのだが、設定に失敗してファイル自体がおかしくなってしまわないように、念のためUnityのファイルをデスクトップに複製したもので試してみることにする。
(こん)