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

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

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

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3618閲覧

攻擊が当たった時に、攻擊が当たった場所の位置を取得したい

Cat_san

総合スコア19

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/02/27 03:52

プレイヤーの攻擊が敵に当たった時に、攻擊が当たった時の位置を取得したいのですが上手くいきません...

■ やってみたこと
敵スクリプト「EnemyBodyCollider」以下を追加

C#

1pos = gameObject.transform.position; 2/* 中略 */ 3public Vector3 GetPosition(){ 4 return pos; 5}

プレイヤーのスクリプト「Player」以下を追加

C#

1EnemyBodyCollider enemyBody; 2void Awake () { 3 enemyBody = GetComponent<EnemyBodyCollider>(); 4 } 5void Update (){ 6 pos = enemyBody.GetPosition(); 7}

Playerに敵の位置が取得できていないようです...

EnemyBodyColliderは複数の敵に適用しているので
参照値を探すことができないのかも...と考えたのですが、
具体的にどうすればいいのかわかっていません...。

ご存知の方 または 検討が付く方などがおられましたらご教授いただけましたら幸いです。

どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Playerスクリプト
enemyBody = GetComponent<EnemyBodyCollider>();

「プレイヤーのオブジェクトに付いているEnemyBodyCollider」を取得しようとしています。
EnemyBodyColliderは敵オブジェクトに付いているかと思いますので、これだと当然動作しません(エラーが出るのではないかと思います)。
また、Update内でGetPositionしていますが、これだと毎フレーム呼び出していることになります。

「攻撃が当たった時」というのをどう処理するかわかりませんが、Colliderと付いているので物理的な衝突判定をしたいものと推察します。
Playerスクリプト内に下記を追記してください。

C#

1//衝突した時に呼ばれる. 2void OnCollisionEnter(Collision collision){ 3 //衝突相手のEnemyBodyColliderを取得. 4 EnemyBodyCollider enemyBody = collision.gameObject.GetComponent<EnemyBodyCollider>(); 5 if (enemyBody != null) { 6 //位置を取得. 7 pos = enemyBody.GetPosition(); 8 } 9}

衝突判定の基本的な使い方は下記をご参考に。
http://wonderpla.net/blog/engineer/Introduction_Unity_4/

投稿2016/02/27 06:04

sakura_hana

総合スコア11427

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

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

Cat_san

2016/02/28 05:35 編集

sakura_hana様 ご返信ありがとうございます。 丁寧な説明で、初心者の私でもとてもわかりやすかったです。 申し訳無いのですが、問題解決はできませんでした…。 記載していなかったのですが、当たり判定はEnemyBodyスクリプト側で処理しています。 ■EnemyBodyスクリプト // 変数を用意 public Vector3 pos; // ダメージ判定処理 void OnTriggerEnter2D(Collider2D other) { // Plyaerの攻擊タグかどうか判別 if (other.tag == "PlayerArm") { // 当たり判定が重複しない処理 AnimatorStateInfo stateInfo = playerAnim.GetCurrentAnimatorStateInfo(0); if (attackHash != stateInfo.nameHash) { attackHash = stateInfo.nameHash; // ダメージ処理はenemyCtrlスクリプトで行う enemyCtrl.ActionDamage (); // 敵の位置をpost pos = gameObject.transform.position; //Debug.Log (pos); PlayerController playerCtrl = other.GetComponentInParent<PlayerController>(); } } } // posを取得するGet関数 public Vector3 GetPosition(){ return pos; } 再質問で申し訳無いのですが… 追記していただいたプログラムの場合、Plyaerスクリプト側に 当たり判定の処理が必要なのでしょうか…? お手数をお掛けいたしますが、どうぞよろしくお願いいたします。
sakura_hana

2016/02/28 05:54

なるほど了解です。 であれば、以下のように変更します。 ■Player.csはEnemyBodyからの情報を受け取るだけにする。 ■EnemyBodyは衝突時、Playerに情報を渡す。 ■Player.cs public void EnemyHit (Vector3 enemyPos) { //位置を受け取った時の処理 } というメソッドを追加。(メソッド名と引数は適宜調整してください) (OnCollisionEnterメソッドは不要なので忘れてください) ■EnemyBody.cs 既存コードの PlayerController playerCtrl = other.GetComponentInParent<PlayerController>(); の次の行に、 playerCtrl.EnemyHit(pos); を追加。 本当は当たる度にGetComponentInParentをするのは負荷がかかるので、(Player.csがシーン内に1つしかないなら)クラス変数に保存しておき、2回目以降はそちらを使うといいと思います。
Cat_san

2016/03/21 13:22

sakura_hana 様 ご連絡が遅くなってしまい申し訳ありません… とても素早いレスありがとうございました! 無事解決いたしました! また、動きだけでなく負荷をかけないようにする 仕組みも教えていただきましてありがとうございます。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問