プレイヤーキャラクターが発射する弾丸をアイテム取得で変わるようにしたい。
解決済
回答 5
投稿
- 評価
- クリップ 1
- VIEW 1,580
前提・実現したいこと
【現状自分のスキル】
・Unityの操作とAssetについてちょっと理解している。
・プログラミングやC#はまったくの素人。
・現在WEBに公開されているチュートリアルを見ながらゲーム作りを勉強中
※http://hiyotama.hatenablog.com/entry/2015/06/12/153523
【やりたい事】
2D横スクロールゲームで、
1) ⇒ 2種類の敵が出現し、それぞれの敵は回復とバレットアイテムをドロップする
2) ⇒ 回復アイテムはプレイヤーが取得するとHPが回復する
3) ⇒ バレットアイテムは、取得するとプレイヤーの弾丸が変わります
4) ⇒ 特定の所にいくと、ゲームクリアになる
発生している問題・エラーメッセージ
【問題点】
上チュートリアルページを参考に、やりたい事の1、2、4までは作る事ができました。
次に、弾丸のようなものをドロップさせて、それをプレイヤーキャラクターが取得すると通常の弾丸から取得した弾丸(例:青い弾丸から赤い弾丸)に切り替えたいのですが・・・
そこがわかりません。
試したこと
課題に対してアプローチしたことを記載してください
RPGゲーム作成チュートリアルなどの、武器の持ち替えのスクリプトなどを見ながら抜き取って使えるものがあれば使おうと思いましたが・・・コードを理解していないせいで、エラーばかりでうまくいきません・・・
たすけてください。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
シンプルに考えましょう。
要は「フラグの状態によって生成する弾オブジェクトを切り替える」処理があればいいわけです。
1.Bulletプレハブを複製します。(プレハブを選択してCtrl+D)
元々あった方をBullet1、新しく作った方をBullet2とします。
2.Bullet2プレハブを編集して、色等を変えておきます。
(最初は見た目を変えるだけにしておくといいと思います)
3.PlayerScript.cs内のpublic GameObject bullet;
の行を、
public GameObject bullet1;
public GameObject bullet2;
[HideInspector]
public bool isBullet2; //切り替え用フラグ(trueならbullet2を使う)
と変更します。
その後、インスペクタでbullet1にBullet1プレハブ、bullet2にBullet2プレハブをセットしておきます。
(isBullet2は[HideInspector]を付けているのでインスペクタ上では表示されないようになっています)
4.PlayerScript.cs内のInstantiate(bullet, transform.position + new Vector3(0f,1.2f,0f), transform.rotation);
の行を
GameObject bullet = bullet1;
if (isBullet2) { bullet = bullet2; }
Instantiate(bullet, transform.position + new Vector3(0f,1.2f,0f), transform.rotation);
と変更します。
「弾としてbullet1プレハブを利用するよ。ただしisBullet2フラグがオンだったらbullet2プレハブを利用するよ」という意味のコードです。
5.弾を切り替えたいタイミングでisBullet2のtrue/falseを切り替えます。
「体力回復アイテムを取得した時」と同じ要領でPlayerScriptのisBullet2を操作すればOKです。
基本はこんな感じです。
あとは必要に応じてBulletScriptやEnemyScriptをカスタマイズしてみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
PlayerScriptに弾丸の種類を保持するPublicな変数bulletTypeと青の弾丸のGameObject blueBulletを追加し、 回復アイテムと同様に、弾丸のアイテムが接触したらbulletTypeを"blue"に変更し、ショット時にbulletTypeでどのbulletを打つかを選択させればいいのでは?
(未検証だが、考え方としてのコード)
public class PlayerScript : MonoBehaviour {
// ...
public GameObject bullet;
// 青の弾丸のGameオブジェクトを用意(アタッチしておく)
public GameObject blueBullet;
// bulletTypeを用意。わかりやすくstring型にしたが別に管理できればそれ以外の型でいい。
public string bulletType = "normal";
//...
void Update() {
// ...
if (Input.GetKeyDown ("left ctrl")){
anim.SetTrigger("Shot");
GameObject b = null;
if(bulletType == "normal") {
b = bullet;
} else if(bulletType == "bulue") {
b = blueBullet;
}
Instantiate(b, transform.position + new Vector3(0f,1.2f,0f), transform.rotation);
}
// ...
}
弾丸アイテムのItemScript.cs
public class ItemScript : MonoBehaviour {
// ...
void OnCollisionEnter2D (Collision2D col)
{
//ユニティちゃんと衝突した時
if (col.gameObject.tag == "UnityChan") {
// bulletType変数の値をbulletTypeを"blue"に変更
col.gameObject.GetComponent<PlayerScript>().bulletType = "blue";
//アイテムを削除する
Destroy(gameObject);
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
例示のサイトのつづきのコンテンツ【Unity8】ユニティちゃんが攻撃!SetTrigger, Instantiate【ユニティちゃん横スクロール5】で弾丸となるPrefabを複数(Bullet_Redとか)つくっておいて、変数bullet_Redとかも定義して条件にあわせてInstantiateすれば済む話では?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
皆様、ありがとう御座いました!
多くのご返答に感謝いたします。修正箇所まで細かくご伝授頂きまして、本当に助かりました。
正直、いまだに解決はできていませんが・・・教えていただいた情報を元になんとか自力でできるところまで
やってみようと思っております。
また本当に限界まできたら、再度ご質問したいと思います!
ベストアンサーですが、一番最初に、それもとても詳細に書いていただいたsakura_hanaさんにお送りいたします!
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
【なんと解決できました!】
最初はsakura_hanaさんが教えていただいた方法でやっていましたが、エラーで進めなくなりました。
※エラーのSSを撮り忘れてすみません・・・
しかし、turbgraphics200が書いていただいたコードを適用したら普通に思い通りのものができました。
その際いくつか問題となって悩んだ点は
- 新しいBulletにTag設定を忘れていたのでエラーがでていた。
- BulletにIsTrigerを設定していないため、敵を倒せなかった。
- プレイヤーととBulletItemのphsics 2d関係を設定していなかったため、取得できなかった。
- Scriptの名前と宣言に書いた名前が一致しない。
などでした。
どれもアホなボンミスですが、注意深く確認を行わないとすぐエラーがでるなーと再三認識しました。
次ぎは、いきなり飛び級で難易度が上がりそうですが・・・ガチャシステム導入してみたいと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる