質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

660閲覧

Unity 3DのアクションRPGでバトルを真面目に実装したい。他のスクリプトとの関係を綺麗にまとめる方法

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2020/01/11 07:44

1、アクションゲームで敵を攻撃する際に武器にコリジョンを入れると思いますがその時にどこで敵を倒した時の削除コードDestroy()コードを書けばいいか知りたいです。

2、プレイヤーと敵とのスクリプトと変数の情報を行ったり着たりする関係をどう行えば綺麗にわかりやすくできるのか知りたい。
現状 武器スクリプトをプレイヤーの攻撃管理スクリプトと仮定しているスクリプトファイルに伝えて攻撃中だったら消すことを武器スクリプトに伝えるという回りくどいやりかたになってしまっているのですがこの辺の処理はどうやるのが一般的というかベターなのでしょうか?

※提示コードは暫定であり正しく動いていません。

/*プレイヤーの武器にアタッチする  プレイヤーの子の武器オブジェクトにアタッチしているスクリプト*/ public class Weapon : MonoBehaviour { public bool IsAttack//当たったかどうかを攻撃管理スクリプトに通知するプロパティ { get{return isAttack; } set {isAttack = value; } } private bool isAttack; GameObject player; Attack at; // Start is called before the first frame update void Start() { isAttack = false; player = GameObject.Find("Knight"); at = player.GetComponent<Attack>(); } // Update is called once per frame void Update() { Debug.Log(at.IsAttack); } private void OnTriggerEnter(Collider other) { if(other.tag == "Enemy") { isAttack = true; //Debug.Log("Hit !!!"); }else{ isAttack = false; } // Destroy(other); if (at.IsAttack == true) { // Destroy(other.gameObject); at.reObject = other.gameObject; } } }
/*プレイヤーにアタッチしている攻撃管理スクリプト */ public class Attack : MonoBehaviour { public bool IsAttack//当たったかどうかを外部に伝える。 { get{return isAttack;} set{isAttack = value;} } private GameObject g; public GameObject reObject { set{g = value;} } private bool isAttack; private Animator ani; private Animation anition; Weapon wp; GameObject gb; // Start is called before the first frame update void Start() { isAttack = false; g = null; ani = GetComponent<Animator>(); gb = GameObject.Find("Sword"); wp = GetComponent<Weapon>(); } // Update is called once per frame void Update() { if(Input.GetMouseButtonDown(0) == true ) { //isAttack = true; ani.SetTrigger("Attack"); } if(ani.GetCurrentAnimatorStateInfo(0).IsName("Attack") == true) { Debug.Log("ダメージ!!!"); isAttack = true; }else{ isAttack = false; } if(g != null) { Destroy(g); } } private void Hit() { } }

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

敵のDestoryは敵のクラスから呼び出すべきです
基本的には、自分のことは自分でやるとしないと、
敵の消滅周りの処理の変更する時に、Playerクラスを書き換える、ってのはおかしいわけです

で、こんな感じじゃないかなぁというのを書きました

interface IHit{ void OnHit(Person, Weapon); } class Enemy: IHit{ void OnHit(Person p, Weapon w){ Damage(w.power); } bool Damage(int damage){ if (0 < hp){ hp -= damage; if (hp <= 0){ Destory(gameObject); } } } }

他のクラスとはインターフェースを継承してその関数を呼んでもらうことで処理する、というのがいいと思います
インターフェースにする理由は、敵ではなく木や宝箱にあたったときの処理なんかもまとめて行うためです

投稿2020/01/12 14:02

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/13 07:07

質問ですがEnemyとはアタッチしているオブジェクトつまり敵なら敵で木なら木ということでいいのでしょうか?
izmktr

2020/01/13 07:21

Enemyは敵につけるスクリプトで、木につけるならTreeというクラスを定義し、IHitを継承する感じです (もちろん、武器と当たり判定を持つ木だけで、ただの背景で当たり判定を取らないのならスクリプトはいらないです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問