MYMYゲーム制作室

アラ古希姉妹のゲーム制作日記

「クリクリ小坊主〜栗拾いゲーム〜」のプロモーションムービーを作った

5月にGooglePlayでリリースした「クリクリ小坊主〜栗拾いアクションゲーム〜」を
やっとAppStoreのほうにも出せる準備が整った。

XCodeでビルドするところで、すったもんだあり、1ヶ月ほど停滞していたのが、やっと解決したので、あとはストア画面を整えることに。

今回はプロモーション動画も作ることにした。

AppStoreではiPhone用とiPad用、それぞれに違うサイズの動画なり静止画形をアップロードする必要がある。このサイズというのが、ピッタリでないとリジェクトされてしまう。

iPhone用のものは、iPhoneで実機テスト(TestFlight)した時に、プレイ動画を撮ってそれを元にしてIMovieで制作した。それは、案外すんなり作れてアップロードすることができたのだが、その後、iPad用の動画を同じように作ったつもりなのに、なぜか警告がでてリジェクトされてしまった。警告の内容はこうだ。

「アプリプレビューのオーディオがサポートされていないか破損しています。」

 

ここに備忘録としてその場合の解決の道すじを残しておく。

 


結局のところ、iPhone用と同じ手順で作ったと思ったのは、勘違い。
iPhone用のは実機テストしながら、動画を撮ったもの。
今回iPad用のプレイ動画はMacBookのUnityのGameシーンのプレイを録画したもの、
素材となる動画の撮影方法が違ったので、うまくいかなかった可能性は大。

今回の手順はこう。


①UnityでのGame再生の様子を動画として録画する


・UnityのGameタブを開き、これだけをUnityの外側で表示させる。

・Gameビューの上にあるRecolution(解像度)のところで、ちょうどピッタリの選択肢がないので、自分で作る。AppStoreConnectのiPad用動画の規格は1600x1200となっているので、解像度のメニューの一番下に+マークを押して新しく解像度を追加する。1600x1200iPadとして、これを選択。
・Gameを全画面表示にする。
・動画撮影のショートカット。Shift+Command+5。これで出てきたコントロールパネルみたいな横長のバーの中の「選択したウィンドウを収録」というアイコンを選ぶ。そうすると撮したいエリアを囲む線が出てくるので、ドラッグしてGameビューがすっぽりハマるように拡大する。

・Gameを再生する。▶️。
・録画のオプションで今回は「5秒後に収録開始」を選んだので、ボタンを押すと5秒後に録画がスタートする。(ちなみに再生している間にBGMはなっている。)

・利用したい部分の動画を撮ったら録画中止。ショートカットはControl+Command+esc。撮れたものが画面右下に現れるので右クリックして「デスクトップに保存」を選ぶ。

・再生の途中で静止画をのこしたい部分があったら、一時停止して、画面全体の静止画を撮っておく。ショートカットはShift+Command+4。停止は動画と同じで、Control+Command+esc。

・ここまでの処理でできた動画ファイルの「情報をみる」してみるとサイズが、AppStoreの規格の1600x1200とはずれた数値になっている。しかしここでは、気にしない。あとで数値を合わせるので。

 

 

②撮れた動画と静止画を素材としてムービーを作る

Macに内蔵のアプリ、iMovieでムービーを編集する。

IMovieでは、同じ素材をつかうムービーをライブラリーと称して、その中にいくつものプロジェクトとよばれるものを作ることができる。いわゆるファイルというものは、このプロジェクトというものに相当する。タイムラインでテキストや音やトランジションを組み込んだものがプロジェクト。これは自動保存される。画面左上にある<プロジェクトをクリックすると、このライブラリーの中に保存されたすべてのプロジェクトが表示される仕組み。タイムラインのあるページの左上半分のところが素材となるクリップを集めておく保管庫のようなエリア。ここに使いたい静止画や動画を選んでいれておく。その中のものをタイムラインにドラッグしていれる。静止画でも4秒という長さのあるもののように表示されるが、それはiMovieの仕様であって、気にせずに表示したい長さの秒数に伸ばしたり縮めたりすればよい。

・動画もドラッグして入れて、長さを調整する。AppStoreに出す動画は30秒以内が条件。

・テキストは上のほうの「タイトル」というタブを選んで、文字の現れ方の好みのものをえらんで、右上のプレビューエリアで内容を変更する。Tのマークを選ぶとテキストの中身を編集できる。

・いれた動画などがスライドのサイズと合っていない時は、プレビュー画面の上の方のクロップマークをえらび、それででてくる選択肢から「フィット」を選ぶ。

・編集が終わったら、自動保存されているので、そのまま残る。
・このタイムラインを保存したいと思ったら、ファイル→「共有」→ファイルを選ぶ。そのあと保存の設定画面になるが名前と保存場所をきめて保存。

・この時点で、保存したもののサイズはまだ1600x1200の規格になっていないし、音はついていない状態。

ここで音がないとあとで、AppStoreConnectでさっきのエラーがでてリジェクトされるので、音をつけるのが大事なステップ。
タイムラインの絵のしたに♪マークのトラックがある。ここにBGMの音ファイルをドラッグしていれる。再生してみると音がでるが、プレビュー画面の上のスピーカーマークをみつけて、ボリュームを1%にしておく。全くの無音にしてしまうとリジェクトの原因になってしまうので、音があることが必要、しかし聞こえなくていいので、1%にしておく。0%にしないこと!

・保存したものの拡張子は、自動的にmp4となる。

③このmp4のサイズはまだ規格に沿っていないので、修正が必要。

Mac内蔵のKeyNoteを開く。

・新規作成。

・開いた画面の右上のほうに「書類」というアイコンがあるのでクリック。

・ここでスライドのサイズをデフォルトでなく、1600x1200にカスタマイズ。

・それで開いた画面にさっき書き出した動画をドラッグしていれる。

・ムービーのタブを選んで、設定

・これで、ファイル→書き出す→解像度の設定をカスタムに変更→1600x1200にする。

・次のスライドに移動は0、次のビルドに移動も0にしておく。そうしないと、せっかくiMovieで30秒いないに収めた動画が、長くなってしまうので。

 

④書き出した動画ファイルの「情報を見る」してみると、1600x1200と企画にはまるようになっている。

⑤AppStoreConnectのアップロード。これで音声トラックのついた動画が所定のサイズで保存されたことになるので。

 

 

 

 

 

 

 

 

MYMYkoubou プライバシーポリシー 2025.03.21改訂




MYMYkoubou
(the “Company”) herein establishes this Privacy Policy with respect to the treatment of the Personal Information obtained by the Company and promises to comply with this Privacy Policy, Act on the Protection of Personal Information of Japan and relevant laws and regulations and to treat the Personal Information in an appropriate manner.

Personal Information

The Company may obtain the Personal Information (defined in Article 2.1 of Act on the Protection of Personal Information of Japan) in the course of business activity.

Obtainment of Personal Information

The Company shall expressly show the purpose of utilization and shall not obtain the Personal Information by a deception or wrongful means.

Purpose of Utilization

The Company shall use the Personal Information within the scope necessary for the achievement of the purpose of utilization as follows;

(1) to identify or to use an authorization service to identify the principal;
(2) to charge fees of the Company's services;
(3) to respond to opinions, demands or inquiries, etc.;
(4) to perform questionnaires, campaigns or events, etc.;
(5) to advertise the Company or third parties that entrust the Company to advertise;
(6) to perform marketing research or analysis with respect to situation of utilization or implementation of the Company's services;
(7) to survey and analyze for improvement or enhancement of the quality of the Company's services;
(8) to survey and analyze for planning of new services or new functions;
(9) to survey or solve system failures, problems or accidents of the Company's services or network, etc.; and
(10)to otherwise operate the Company's services smoothly.

Provision to Third Parties

The Company shall not provide the Personal Information to third parties without obtaining the prior consent of the principal (including the consent pursuant to a specific provision in terms and conditions of the Company's services) except in the following cases;

(1) cases where the Company discloses to a financial institution, a credit card company or any other payment agency for the purpose of the settlement of the payment;
(2) cases where the Company entrusts all or part of the business of the Company to a third party;
(3) cases where the Company discloses to a third party that executes a non disclosure agreement with the Company;
(4) cases where the provision of Personal Information is permitted under the Act on the Protection of Personal Information of Japan and any other laws or regulations; or
(5) cases where a court, a police, a governmental authority such as a tax office or public organization such as a bar association requests the Company to disclose under laws or regulations.

Disclosure, Correction, Deletion, etc.

If you hope to disclose, correct, add or delete your Personal Information under the Act on the Protection of Personal Information of Japan or any other laws and regulations, please contact us.

Security Control Measures

The Company shall make endeavor to keep the Personal Information accurate and up to date, establish and maintain internal rules for security control of the Personal Information, exercise necessary and appropriate supervision over the employees and make endeavor to take reasonable and strict security control measures in terms of technical and organizational matters.

Term of Storage

The Company shall determine the term of storage of the Personal Information within the scope necessary for the achievement of the purpose of utilization and delete the Personal Information after expiration of such term or completion of the purpose of utilization without delay; provided, however, that this shall not apply to any of the following cases;

(1) cases where the Company shall be required to store the Personal Information under applicable laws or regulations;
(2) cases where the Company obtains the consent of the principal; or
(3) cases where the Company determines that the Company stores the Personal Information for reasonable reason.

Measures for Leakage

If the leakage of the Personal Information occurs, the Company shall survey facts promptly and take appropriate measures such as notification to the principal.

Continual Improvement

The Company shall make endeavor to continuously improve the treatment of the Personal Information by internal audit or employee education.

Amendment to Privacy Policy

The Company may amend the Privacy Policy without prior notice. In cases where this Privacy Policy has been amended, the Company shall publish such amendment on the website of the Company. Please check such amendment periodically.

Inquiry

For any inquiry, please contact mymykoubou@gmail.com(Time 9:00-17:00)

Supplementary Provisions:This Privacy Policy shall become in force and effect as of March 21, 2025

やっと完成!昔話2枚のお札外伝・アクションゲーム「くりひろい」2025.03.17

お正月から制作していたパズルゲームの製作があまりにも難しく諦めて、2月の頭から方向転換して作り始めた昔話「3枚のお札」外伝・アクションゲーム「くりひろい」

2月末の完成をめざしていたものの「3歩進んで2歩戻る」、時には「3歩進んで5歩戻る」の繰り返しで、毎日夜中の3時4時まで頑張ったのに、進みは遅く完成はのびのびになってしまった。ChatGPTとの会話で毎日が過ぎていった。

しかし、やっとこさっとこ、今日をもって完成!

Androidの実機テストもやって、なんとかプレイできるものが出来た。

やれやれ。

最初のプランでは、タイトルから進んでシーンは日本の昔話の雰囲気で、地図が巻物になっていて、その中に書かれている山をボタンにして、それぞれのゲームを山にたとえて10の山までゲームシーンを作るというものだった。

10の山を攻略できたら全クリというものだったが、各ゲームシーンのクリア情報をセーブしてロードするというスクリプトが複雑になりすぎて、手に負えなくなってしまった。stageだのcurrentStageだclearedMauntainだのLastClearedMountainだのいろんな変数をGPTが作ってくれて、それが配列の数値をごっちゃになってしまったのだった。そこを乗り越えようとあがいたものの、ChatGPTも堂々巡りをするだけで、問題解決が出来そうもなかったので、それを断念。

そこまでにずいぶん日数を浪費してしまったが、GPTさんとのやり取りでは、いろいろ学ぶことも多かったから、無駄ではなかった。

でも、計画は大幅に遅れ、その後も、一か所直すとそれまでうまく行っていた部分が今度はおかしくなるという賽の河原の状態が延々と続き、運動不足にはなるし、睡眠不足にもなるし、ほんとに孤独な闘いだった。

今日で一応の完成にたどり着けて、ほんとにホットした。

でも、この後、広告をつけたり、ストアに出すアイコンや説明文などもつけなくてはならないから、もしかしたら、ここからがスタートなのかも。

いやはや、世の中に星の数ほどのゲームがあるだろうけど、どんなゲームもそれぞれ苦労の結果なのだろうと思う。日頃、遊ばせてもらっているゲームも、その陰にはいろんな人の努力があるんだな~~としみじみ思う。たとえChatGPTが教えてくれるにしてもそれを活用するには、プロンプトの出し方や、こっちの知識の有無が大事なんだなとわかってきた。



 

 

Unity Chat GPTが教えてくれたこと!すり抜けを防止する

🛠 IsTrigger を有効にすると地面をすり抜ける問題

2025.03.01

確かに、小坊さん(Player)の IsTrigger true にすると、地面の Collider2D にぶつからなくなり、すり抜けてしまう ことがあります!


----------------------

📝 解決策(ベストな方法)

1. Rigidbody2D Collision Detection を変更

  1. 小坊さん(Player)の Rigidbody2D を選択
  2. Collision Detection Continuous に変更
    • Discrete だと高速移動時に地面をすり抜けることがある
    • Continuous にすると、物理演算の更新ごとにコライダーをチェックし、すり抜けを防ぐ


----------------------

2. IsTrigger の代わりに「判定用のコライダー」を追加

  1. Player 2 つの Collider2D をつける
    • 通常の BoxCollider2D(または CapsuleCollider2D → IsTrigger = false(地面と衝突)
    • 新しい CircleCollider2D(または BoxCollider2D → IsTrigger = true(当たり判定用)
  2. Trigger 用の Collider2D を少し大きめに設定
    • 小坊さんの体の周りに 判定専用の Collider2DIsTrigger = true を作る
    • 通常のコライダー(地面用)は IsTrigger = false のままにする
    • こうすることで、「地面の判定は残しつつ、降ってくる栗との当たり判定は OnTriggerEnter2D() で取れる」


----------------------

🛠 具体的な設定方法

  1. 小坊さんの Player オブジェクトを選択
  2. Add Component BoxCollider2D(または CapsuleCollider2D)を追加
    • このコライダーの IsTrigger false のままにする(地面用)
  3. もう一つ CircleCollider2D を追加
    • このコライダーの IsTrigger true にする(当たり判定用)
    • Size を少し大きめに設定し、頭のあたりまでカバーするように調整
  4. OnTriggerEnter2D() を使って、栗や爆弾とぶつかった判定を取る
  5. OnCollisionEnter2D() を使って、地面との接触を処理する

 

Unity Chat GPTが教えてくれたこと!親子関係のオブジェクトのサイズ

2024年の暮ころから、Unityの分からないことは、全部Chat GPTに聞いている。
自分の備忘録として残しておく。

親子関係になっているオブジェクトのサイズの決め方

SpawnAreaはもとはEmptyObjectです。それにはTransformというコンポーネントがついていt、ポジションはローテーションは全部0,スケールは1となっています。ここに2DオブジェクトのSquareを入れて、サイズをいい感じにする場合、親であるスポーンエリアのTransformと関係なく、自分自身の最初のサイズを何倍するかということになりますか? この四角の大きさをピクセルで表現することもできるのですか?

 

ChatGPT:

 

Unityでは、親オブジェクト(SpawnArea)の Transform と、子オブジェクト(Square)の Transform は関連がありますが、スケールや大きさを決定する際にはいくつかのポイントを押さえておく必要があります。


----------------------

  1. 親オブジェクトの Transform の影響
  • 親オブジェクト(SpawnArea)の Scale が子オブジェクトのスケールに影響を与えます。
    • 例えば、親の Scale が (2, 2, 1) で、子のスケールが (1, 1, 1) の場合、子の見た目の大きさは実際に (2, 2, 1) になります。
  • Position も相対的に影響を受けます。
    • 子の Position は、親を基準としたローカル座標で指定されます。


----------------------

  1. 子オブジェクトの Square のスケール設定

子オブジェクトとして Square を配置した場合、スケールや見た目のサイズは 以下の2つの要素 によって決まります。

(1) 子オブジェクトの Transform.Scale

  • 子オブジェクトのスケールは、親のスケールを掛け算した結果になります。

(2) 子オブジェクトのスプライトの Pixel Per Unit (PPU)

  • スプライト画像のピクセル数を 1 Unit にどれだけ割り当てるかを決める値です。
    • 例: PPU = 100 の場合、スプライト画像の 100 ピクセルが Unity の 1 Unit に対応します。


----------------------

  1. スクエアのサイズを「良い感じ」に設定する方法

Square のサイズを SpawnArea に合わせるには、以下のいずれかの方法で調整します。

方法1: 親のスケールを 1 のまま、子オブジェクトのスケールを調整

親のスケールが (1, 1, 1) のままの場合、子のスケールだけを変更して調整します。

csharp

コードをコピーする

// スポーンエリアの大きさに合わせる squareTransform.localScale = new Vector3(spawnAreaWidth, spawnAreaHeight, 1);

方法2: 親のスケールを変え、子を (1, 1, 1) のままにする

親のスケールを直接変更し、子オブジェクトは (1, 1, 1) のスケールのままにします。

csharp

コードをコピーする

spawnAreaTransform.localScale = new Vector3(10, 5, 1); // 例えば幅10、高さ5のエリア


----------------------

  1. スクエアの大きさを「ピクセル」で表現する方法

ピクセル単位で表現するには、スプライトの Pixel Per Unit (PPU) を利用

  1. PPUを確認する:
    • 例えば、Square のスプライトの PPU = 100 なら、100ピクセルで 1 Unit に相当します。
  2. Unityのスケールとピクセルの対応関係を計算:
    • スプライトの幅(ピクセル) = スプライト画像の幅 ÷ PPU × スケール
    • 例: 幅 256 ピクセルの画像、PPU = 256、スケールが 1 の場合、幅は 1 Unit。
  3. 具体例
    • Square の PPU = 256 の場合:


----------------------

  1. SpawnArea の大きさに正確に合わせる

以下の手順で Square を SpawnArea に正確に合わせます。

  1. SpawnArea の大きさをピクセル単位で計算
    • 幅(ピクセル) = SpawnAreaのスケール × PPU
    • 例えば、Scale = (10, 5, 1)、PPU = 256 の場合:
  1. Square をスケール調整
    • 子オブジェクトとして配置した Square のスケールを (10, 5, 1) に設定。
    • これにより、Square が SpawnArea に正確にフィットします。


----------------------

まとめ

  1. SpawnArea と子オブジェクトのスケール関係
    • 親のスケールを 1 に固定し、子のスケールを調整する方が分かりやすい。
  2. ピクセルベースのサイズ計算
    • スプライトの Pixel Per Unit (PPU) を基準に、スケールとピクセルの関係を計算。
  3. Square の追加が最適
    • 2D Sprite の Square を子オブジェクトに追加するのが最適解。

これで、SpawnArea の四角を目に見えるように、正確に配置できるはずです。さらに質問があれば教えてください! 😊

 

Yotohikaの動きは完成したが、次なる難題が!ボタンの無反応(備忘録)

歩く、走る、ジャンプするの動作、そしてそれを追いかけるカメラの操作、ここまでうまくいくようになった。

 

次はパネルにボタンを配置して、シーン上のアイテムを「とる」「しゃがんでとる」「あける」「割る」などのアニメーションを選べるようにしようとしたところ、全くボタンが反応しない。

 

AIもいろいろ知恵をしぼってくれてはいるのだが、どの提案を試してみても、上手くいかない。

 

最後に「新しいシーンを作って、パネルとボタンだけを配置して、ボタンが機能しているかどうかをチェックすればいい」と、AIが提案してくれたので、それをやってみる。

消去法で「何を追加した時にダメになるのか」を調べようというわけだ。

 

パネルとボタンだけなら、まったく問題なく反応している。

そこにテレインを入れても大丈夫。

そして、そこにYotoArmatuareを追加すると、とたんに無反応になる。

 

このYotoは元がThirdPersonなので、中にいろいろ組み込まれていて、自分でいれたコンポーネントの他にもなにやら入っている。

 

チェックを外せるコンポーネントは全部チェックを外して試してみたが、それでもボタンは無反応。となると残るは、自分でチェックを入れる切るができない二つのコンポーネントが悪さをしている可能性が見えてきた。

 

その二つは、「Basic Rigid Body Push(Script)とStarter Assets Inputs(Scripit)」

これから、またChatGPTさんに相談しながら、原因を究明しなくては、先に進めない。

 

ChatGPTさんの答え

ボタンが「YotoArmature」をシーンに追加したときに反応しなくなる問題ですね。Basic Rigid Body PushStarter Assets Inputsスクリプトが影響している可能性が高いです。ここで考えられる原因と解決方法をいくつか挙げてみます。

原因と推測

  1. Starter Assets Inputs スクリプトの影響
    このスクリプトは入力管理を担っているため、UIボタンへの入力(マウスクリックやタップなど)が奪われている可能性があります。特にキャラクターがThird Person Controllerの仕組みで動いている場合、ゲーム内の入力がすべてプレイヤーキャラクターの操作に割り当てられていることが原因です。

  2. イベントシステムの競合
    シーン内に複数のイベントシステムが存在すると、UIの入力処理が正常に行われなくなることがあります。シーン内にEventSystemオブジェクトが1つだけ配置されているか確認してください。

解決策

以下の手順で原因を切り分けながら解決を試みてください。

1. Starter Assets Inputs の影響を確認する

  • Starter Assets Inputs コンポーネントがキャラクターの入力をすべて受け取ってしまうのを防ぐために、UI向けのイベントシステムを追加します。
  • Unityのトップメニューから GameObject > UI > Event System を選んで追加してください。
  • EventSystem オブジェクトを1つだけ残し、重複している場合は1つを削除してください。

2. ボタンのNavigation設定を確認

  • ボタンのナビゲーション設定が原因でクリックが反応しなくなる場合もあります。
  • ボタンのインスペクターでNavigation設定をNoneに変更してみてください。

3. プレイヤーの入力とUI入力の競合を防ぐスクリプトを作成

キャラクターのコントローラーがUIに干渉しないように、簡単なスクリプトを追加してみましょう。以下のスクリプトを新しいC#スクリプトとして作成し、キャラクターにアタッチしてください。

using UnityEngine;
using UnityEngine.EventSystems;

public class PlayerInputManager : MonoBehaviour
{
    // Updateメソッドはフレームごとに呼び出される
    void Update()
    {
        // もしUIが現在フォーカスされている場合
        if (EventSystem.current.IsPointerOverGameObject())
        {
            // 入力を一時的に無効にする処理(例:キャラクター移動やアクションを無効化)
            // 実際のプロジェクトに合わせてここでキャラクターの入力を無効にします
            return;
        }

        // それ以外の場合、通常のキャラクター操作を行う
        // (例:移動やジャンプなどのコードをここに記述)
    }
}

3Dキャラクターを動かすまでのつまづき2(備忘録)

ThirdPerson(PlayerArmatureという名前のオブジェクト)の中身をいただくというのがどういうことなのか、というと・・

Hierarchyの中のThirdPersonの子どもを見てみる。その中の「Geometry」を、その子供のMeshともども削除。

そうすると、シーンの中からThirdPersonは消えてしまう。それが見た目を決定しているパートという訳。その代わりに自作キャラのプレハブをThirdPersonの子どもとして入れる。すると、あ~~ら簡単!! 今までサードパーソンが立っていたところに、自作キャラが立っている。これで名前はPlayerArmatureだが、見た目はすっかり自作キャラというオブジェクトが出来上がった。インスペクターを見ると、サードパーソンがもっていたコンポーネントはそのまま残っているので、乗っ取り成功というわけ。

そして、今回はバーチャルカメラも、自分で加えるのではなく、StarterAsset の中に用意されていたものをそのまま頂いて、カメラの設定もそれを使わせていただく。しかし、サードパーソンと自作キャラのサイズがかなり違っていたこともあり、フォローする距離などの数値は、手作業で変更。

しかし、再生してみると、またもやキャラクターの動きに合わせて、カメラが振り回される感じで、景色がぐるぐる回ってしまうという状況に!!

CinemahineVirtualCameraのFollowのところに、サードパーソンはPlayerCameraRootというオブジェクトを入れていたのに、今回は自作キャラにはもともとCameraRootを付けていなかったので、仕方なく自作キャラオブジェクトそのものを入れてみたのだが、それが原因だったようだ。選択肢の中に、CameraRootが二つあり、この一つはサードパーソンのもの、もうひとつが自作キャラのものだったようだ。(この重複は、テストなどのためにシーンに、サードパーソンを乗っ取った自作キャラと本来のサードパーソンと、両方を配置していたため起きたこと)どっちがどっちのものかは、名前からは判断できなかったが、試してみたところ、片方のCameraRootが当たりの方で、そっちをいれることで、ぐるぐる回る問題は解決した。自作キャラに置き換えたが、CameraRootは残っていたので、それをFollowのターゲットにすることで、カメラがスムーズに動いてくれるようになった。

ここにPlayerCameraRootを入れる

2つあった場合はどっちが正しいか試してみる。うまく行ったほうが正解。