恥じらい~Hajirai~制作過程記録

  1. 🎯第一ステップ:マウス追従で自機を動かす
    1. ① 自機のスプライトに以下のスクリプトをつけてください:
  2. 🎯第二ステップ:クリックで弾を出す(左手風圧弾)
    1. ② 空のGameObjectに以下をつけ、「PlayerShooting」などと命名
    2. 弾のプレハブ作成手順:
  3. 🎯第三ステップ:敵スプライトと当たり判定(脱衣管理)
  4. ✅ よくある差し替えパターンと方法
    1. ① スプライトの差し替え(自機や敵の見た目)
    2. ② 弾などのPrefabの差し替え
    3. ③ スクリプト上のSprite配列の差し替え(脱衣段階など)
  5. 弾が飛ばない(固定されたまま)場合
  6. ✅セット手順
  7. 🔧ついでに EnemyDamage.cs のエラーも直そう!
    1. 📌やること:
  8. 🎯結論:弾と敵、どちらかの Rigidbody2D が欠けてる or Trigger設定が不一致!
  9. ✅衝突判定の正しい構成(Unity 2D物理ルール)
  10. 🔧修正チェックリスト
    1. 【弾(Bullet)】
    2. 【敵(Enemy)】
  11. ✅目標:裸時に Player がゆっくり墜落 → GameOver へ
  12. 🎯ステップ①:PlayerFall.cs を作成
  13. 🎯ステップ②:PlayerFall.cs を自機(Player)にアタッチ
  14. 🎯ステップ③:裸になったタイミングで自機を墜落させる
  15. ✅補足:Player に Tag = Player を必ずつけておく!
  16. 🔥完成イメージ
  17. 🧠演出強化したければ後で追加できる
  18. 🎮 Unityで「称号」演出を実装する方法
    1. 🧱 前提環境
  19. 🔧 実装手順
    1. ① 表示するテキスト用UIを用意
    2. ② スクリプト ShowTitle.cs を作成
    3. ③ TitleManager 空オブジェクトにShowTitleをアタッチ
    4. ④ GameOver時に表示する処理を追加
      1. GameOverManager.cs の Update() に以下を追加:
  20. ✅ 表示が出ないときのチェックリスト
  21. ✨完成イメージ

🎯第一ステップ:マウス追従で自機を動かす

① 自機のスプライトに以下のスクリプトをつけてください:

using UnityEngine;

public class PlayerFollowMouse : MonoBehaviour
{
void Update()
{
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mousePosition.z = 0; // 2Dなのでzを0に固定
transform.position = mousePosition;
}
}

🔧ヒント:

  • Camera.main.ScreenToWorldPointでマウスの画面座標→ワールド座標へ変換。
  • transform.position = mousePosition;で自機をその場所へ移動。

🎯第二ステップ:クリックで弾を出す(左手風圧弾)

② 空のGameObjectに以下をつけ、「PlayerShooting」などと命名

using UnityEngine;

public class PlayerShooting : MonoBehaviour
{
public GameObject bulletPrefab; // 弾のプレハブ
public Transform shootPoint; // 弾の発射位置

void Update()
{
if (Input.GetMouseButtonDown(0)) // 左クリック
{
Instantiate(bulletPrefab, shootPoint.position, Quaternion.identity);
}
}
}

弾のプレハブ作成手順:

  1. Spriteを新規作成(例:白丸など)
  2. 2D Collider + Rigidbody2D(重力スケール = 0)
  3. Bulletタグ or Layerにしておくと後で便利

🎯第三ステップ:敵スプライトと当たり判定(脱衣管理)

using UnityEngine;

public class EnemyDamage : MonoBehaviour
{
public Sprite[] damageStages; // 0=無傷, 1=破け, 2=水着, 3=破れ水着, 4=おっさん
private int currentStage = 0;

private SpriteRenderer sr;

void Start()
{
sr = GetComponent<SpriteRenderer>();
sr.sprite = damageStages[0];
}

void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Bullet"))
{
Destroy(other.gameObject);
currentStage++;

if (currentStage < damageStages.Length)
{
sr.sprite = damageStages[currentStage];
}
else
{
// Game Over演出へ
Debug.Log("Game Over!");
}
}
}
}

アセットの差し替えはいつでも超簡単にできます!
とくにUnityのSpritePrefabは、見た目だけ後から入れ替えるのが基本設計になってます。


✅ よくある差し替えパターンと方法

① スプライトの差し替え(自機や敵の見た目)

  • 方法:
    1. ヒエラルキーで該当GameObject(例:Player)を選択
    2. 「Sprite Renderer」コンポーネントの「Sprite」欄を、新しい画像にドラッグ
  • 🔁どんなタイミングでも可能。
  • 🎨プログラムやコライダー設定はそのままで、見た目だけ変わる

② 弾などのPrefabの差し替え

  • 方法:
    1. bulletPrefabとして登録してるPrefabを、新しい見た目で作ったSpriteに差し替え
    2. 既存のPrefabを選んで「Replace Sprite」で画像変更するだけ
  • 💡プレハブの中身を更新しても、すでにシーンに置かれたものに即反映される!

③ スクリプト上のSprite配列の差し替え(脱衣段階など)

csharpコピーする編集するpublic Sprite[] damageStages; // インスペクタで設定可能
  • 方法:
    1. Unityのインスペクタで、damageStagesに割り当てたスプライトを後で差し替えるだけ
    2. 順番に注意(例:0=ノーダメ、1=破け…)

弾が飛ばない(固定されたまま)場合

スクリプト内に移動処理がないと、弾は出ても動かないので、以下を弾のスクリプトに加えましょう:

using UnityEngine;

public class Bullet : MonoBehaviour
{
public float speed = 10f;

void Update()
{
transform.Translate(Vector2.right * speed * Time.deltaTime);
}
}
  • 弾が「右方向(⇒)」に飛びます(Vector2.right

✅セット手順

  1. Assets/Scripts/ フォルダに Bullet.cs を作る
  2. Bullet プレハブを選ぶ
  3. Inspector の「Add Component」→ Bullet を検索して追加!

🔧ついでに EnemyDamage.cs のエラーも直そう!

pgsqlコピーする編集するIndexOutOfRangeException: Index was outside the bounds of the array.
EnemyDamage.Start () (at Assets/Scripts/EnemyDamage.cs:13)

これは damageStages[] にスプライトが入ってないことが原因です。

📌やること:

  1. Enemy オブジェクトを選ぶ
  2. EnemyDamage スクリプトの中にある damageStages 配列を確認
  3. ここに5枚のSpriteをドラッグ&順番にセット(例:無傷 → 破け → 水着 → ダメ水着 →裸)

OnTriggerEnter2D() が呼ばれてない(=ここが問題の核心!)


🎯結論:弾と敵、どちらかの Rigidbody2D が欠けてる or Trigger設定が不一致!

OnTriggerEnter2D() が呼ばれない場合、99%の原因はこれです👇


✅衝突判定の正しい構成(Unity 2D物理ルール)

Rigidbody2D(必要)RigidbodyなくてもOK
Collider2D(Triggerじゃない)Collider2D(Is Trigger = ✅ON

🔧修正チェックリスト

【弾(Bullet)】

  • Rigidbody2D がついてる
    • Gravity Scale = 0
    • Body Type = Dynamic
  • Collider2D(例:Circle Collider)ついてる
    • Is Triggerオフのまま(☒チェックしない)
  • ✅ Tag = “Bullet”

【敵(Enemy)】

  • BoxCollider2D(または他のCollider)ついてる
  • Is Triggerチェックが入ってる(☑)

EnemyのIs Triggerにチェックを入れて解消。

✅目標:裸時に Player がゆっくり墜落 → GameOver へ


🎯ステップ①:PlayerFall.cs を作成

using UnityEngine;

public class PlayerFall : MonoBehaviour
{
private Rigidbody2D rb;
private bool isFalling = false;

void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.gravityScale = 0; // 通常は無重力(マウス追従)
}

void Update()
{
if (isFalling)
{
// 落下中はマウス追従を止めたいので、位置変更を無効に
return;
}

// 通常のマウス追従
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mousePos.z = 0;
transform.position = mousePos;
}

public void Fall()
{
isFalling = true;
rb.gravityScale = 2f; // 墜落スタート
}
}

🎯ステップ②:PlayerFall.cs を自機(Player)にアタッチ

  • Player オブジェクトを選ぶ
  • 「Add Component」→ PlayerFall を追加!

🎯ステップ③:裸になったタイミングで自機を墜落させる

EnemyDamage.cselse のところを以下のように変更👇

else
{
Debug.Log("墜落開始!");

GameObject player = GameObject.FindWithTag("Player");
if (player != null)
{
PlayerFall fallScript = player.GetComponent<PlayerFall>();
if (fallScript != null)
{
fallScript.Fall();
}
}

// 必要ならここで「GameOver表示」「BGM停止」など入れていく
}

✅補足:Player に Tag = Player を必ずつけておく!

  • Hierarchy で Player を選び
  • 上部「Tag」→ Add Tag"Player" を作って設定

🔥完成イメージ

  1. 弾を当て続ける
  2. 最後のスプライト(裸)に切り替わる
  3. 自機が制御不能になってずどーーーんと墜落
  4. 画面暗転 → GAME OVER

🧠演出強化したければ後で追加できる

  • 墜落速度を徐々に上げる
  • カメラがズームアウト
  • 墜落地点に「意味深なオブジェクト(布団とか)」を配置

墜落せず、いろいろ確認したが、「PlayerFollowMouse」スクリプト側のマウス追従が止まっていなかったことが原因。「PlayerFall」にすでにマウス追従のコードを含んでいたため、PlayerFollowMouseをRemove。解決した。

🎮 Unityで「称号」演出を実装する方法

被弾数に応じてプレイヤーの称号を表示するゲームオーバー演出


🧱 前提環境

  • Unity 6.0 以降
  • TextMeshPro 導入済み(未導入なら「Window → TextMeshPro → Import TMP Essentials」で)

🔧 実装手順


① 表示するテキスト用UIを用意

  1. Hierarchy で UI → Canvas を作成(Render Modeは “Screen Space – Overlay”
  2. Canvasの下に UI → Text - TextMeshPro を作成し、名前を TitleText にする
  3. Font Asset に日本語対応フォント(例:NotoSansJP)を割り当て
  4. Text欄には仮に test と入れて表示を確認
  5. Font SizeWidthAlignment を調整して、中央寄せ&見やすく配置
  6. Textのオブジェクトは非表示(Inspector左上のチェックを外す or SetActive(false)

② スクリプト ShowTitle.cs を作成

csharpコピーする編集するusing UnityEngine;
using TMPro;

public class ShowTitle : MonoBehaviour
{
    public GameObject titleObject;         // TextのGameObject
    public TextMeshProUGUI titleText;      // 実際のText

    void Start()
    {
        titleObject.SetActive(false);      // 初期は非表示
    }

    public void Show(int hits)
    {
        string title = "";
        if (hits == 0)         title = "神速のスケベ";
        else if (hits <= 5)    title = "軽やかなるスケベ";
        else if (hits < 15)    title = "鋼のスケベ";
        else                   title = "不死身のスケベ";

        titleText.text = $"称号:{title}\n被弾数:{hits}";
        titleObject.SetActive(true);
    }
}

③ TitleManager 空オブジェクトにShowTitleをアタッチ

  • 空のGameObjectを作成して TitleManager にリネーム
  • ShowTitle スクリプトをアタッチ
  • Title Object には TitleText(GameObject)を
  • Title Text には TitleText(TextMeshProUGUI)を

④ GameOver時に表示する処理を追加

GameOverManager.cs の Update() に以下を追加:

csharpコピーする編集するif (isGameOver)
{
    ShowTitle showTitle = FindFirstObjectByType<ShowTitle>();
    showTitle.Show(hitCount); // ← ここで称号と被弾数を渡して表示!
}

✅ 表示が出ないときのチェックリスト

  • Textの Width が狭すぎて縦書きになってないか?
  • Font Asset に日本語フォントが設定されているか?
  • Canvas の Render Mode が Screen Space - Overlay か?
  • TextMeshPro コンポーネントが有効か?
  • titleObject.SetActive(true); で表示されるようになっているか?

✨完成イメージ

  • GameOverと同時に 「称号:神速のスケベ」「被弾数:0」 がふわっと表示
  • ゲームの緊張感とユーモアが絶妙にマッチ!

コメント

タイトルとURLをコピーしました