- 🎯第一ステップ:マウス追従で自機を動かす
- 🎯第二ステップ:クリックで弾を出す(左手風圧弾)
- 🎯第三ステップ:敵スプライトと当たり判定(脱衣管理)
- ✅ よくある差し替えパターンと方法
- 弾が飛ばない(固定されたまま)場合
- ✅セット手順
- 🔧ついでに EnemyDamage.cs のエラーも直そう!
- 🎯結論:弾と敵、どちらかの Rigidbody2D が欠けてる or Trigger設定が不一致!
- ✅衝突判定の正しい構成(Unity 2D物理ルール)
- 🔧修正チェックリスト
- ✅目標:裸時に Player がゆっくり墜落 → GameOver へ
- 🎯ステップ①:PlayerFall.cs を作成
- 🎯ステップ②:PlayerFall.cs を自機(Player)にアタッチ
- 🎯ステップ③:裸になったタイミングで自機を墜落させる
- ✅補足:Player に Tag = Player を必ずつけておく!
- 🔥完成イメージ
- 🧠演出強化したければ後で追加できる
- 🎮 Unityで「称号」演出を実装する方法
- 🔧 実装手順
- ✅ 表示が出ないときのチェックリスト
- ✨完成イメージ
🎯第一ステップ:マウス追従で自機を動かす
① 自機のスプライトに以下のスクリプトをつけてください:
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);
}
}
}
弾のプレハブ作成手順:
- Spriteを新規作成(例:白丸など)
- 2D Collider + Rigidbody2D(重力スケール = 0)
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のSpriteやPrefabは、見た目だけ後から入れ替えるのが基本設計になってます。
✅ よくある差し替えパターンと方法
① スプライトの差し替え(自機や敵の見た目)
- 方法:
- ヒエラルキーで該当GameObject(例:Player)を選択
- 「Sprite Renderer」コンポーネントの「Sprite」欄を、新しい画像にドラッグ
- 🔁どんなタイミングでも可能。
- 🎨プログラムやコライダー設定はそのままで、見た目だけ変わる!
② 弾などのPrefabの差し替え
- 方法:
bulletPrefab
として登録してるPrefabを、新しい見た目で作ったSpriteに差し替え- 既存のPrefabを選んで「Replace Sprite」で画像変更するだけ
- 💡プレハブの中身を更新しても、すでにシーンに置かれたものに即反映される!
③ スクリプト上のSprite配列の差し替え(脱衣段階など)
csharpコピーする編集するpublic Sprite[] damageStages; // インスペクタで設定可能
- 方法:
- Unityのインスペクタで、
damageStages
に割り当てたスプライトを後で差し替えるだけ - 順番に注意(例:0=ノーダメ、1=破け…)
- Unityのインスペクタで、
弾が飛ばない(固定されたまま)場合
スクリプト内に移動処理がないと、弾は出ても動かないので、以下を弾のスクリプトに加えましょう:
using UnityEngine;
public class Bullet : MonoBehaviour
{
public float speed = 10f;
void Update()
{
transform.Translate(Vector2.right * speed * Time.deltaTime);
}
}
- 弾が「右方向(⇒)」に飛びます(
Vector2.right
)
✅セット手順
Assets/Scripts/
フォルダにBullet.cs
を作るBullet
プレハブを選ぶ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[]
にスプライトが入ってないことが原因です。
📌やること:
Enemy
オブジェクトを選ぶEnemyDamage
スクリプトの中にあるdamageStages
配列を確認- ここに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.cs
の else
のところを以下のように変更👇
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"
を作って設定
🔥完成イメージ
- 弾を当て続ける
- 最後のスプライト(裸)に切り替わる
- 自機が制御不能になってずどーーーんと墜落
- 画面暗転 →
GAME OVER
🧠演出強化したければ後で追加できる
- 墜落速度を徐々に上げる
- カメラがズームアウト
- 墜落地点に「意味深なオブジェクト(布団とか)」を配置
墜落せず、いろいろ確認したが、「PlayerFollowMouse」スクリプト側のマウス追従が止まっていなかったことが原因。「PlayerFall」にすでにマウス追従のコードを含んでいたため、PlayerFollowMouseをRemove。解決した。
🎮 Unityで「称号」演出を実装する方法
被弾数に応じてプレイヤーの称号を表示するゲームオーバー演出
🧱 前提環境
- Unity 6.0 以降
- TextMeshPro 導入済み(未導入なら「Window → TextMeshPro → Import TMP Essentials」で)
🔧 実装手順
① 表示するテキスト用UIを用意
- Hierarchy で
UI → Canvas
を作成(Render Modeは “Screen Space – Overlay”) - Canvasの下に
UI → Text - TextMeshPro
を作成し、名前をTitleText
にする - Font Asset に日本語対応フォント(例:NotoSansJP)を割り当て
- Text欄には仮に
test
と入れて表示を確認 - Font Size、Width、Alignment を調整して、中央寄せ&見やすく配置
- 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」 がふわっと表示
- ゲームの緊張感とユーモアが絶妙にマッチ!
コメント