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

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

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

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

Q&A

解決済

1回答

2937閲覧

Physics2D.Linecast()に接触しているプレハブから生成したオブジェクトのフィールドの数値を変更したい

MujinSekai

総合スコア18

Unity

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

0グッド

0クリップ

投稿2016/09/10 04:16

編集2016/09/10 09:34

###Physics2D.Linecast()に接触しているプレハブから生成したオブジェクトのフィールドを変更したいと思っています。
スクリーンショット
画像の通り、前回の質問で教えて頂いたLinecast()を使い上下左右に当たり判定をチェックすることにしました(四方向なのは今度背後と前方で敵ダメージ量を変えたいと思っているからです)。当たり判定はうまく機能したのですが、Linecast()に接触しているオブジェクトのフィールドを変更する方法がわかりません。

###該当のソースコード

using UnityEngine; using System.Collections; public class CollisionDetection : MonoBehaviour { public GameObject enemyObject; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnCollisionStay(Collision collision) { enemyObject = collision.gameObject; } }

###試したこと
親オブジェクト(Player)のスクリプトから子オブジェクト(四つのCheck)のスクリプトを取得し、記述されているOnCollisionStay()で接触し続けているオブジェクト(EnemyUndeadのクローン)のhpフィールドを変更したい思ったのですが、実行する前は接触しておらず、オブジェクトは宣言しただけで空?なので当然フィールドは変更できませんでした。他の方法も思いつかず悩んでいます。

###環境
・Unity5.3.4.f1

###ご覧になって下さった方ありがとうございます

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

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

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

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

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

guest

回答1

0

ベストアンサー

EnemyUndeadのGameObjectにHPフィールドを管理するスクリプトがAddComponentされているのでしょうか?
であれば、

C#

1void OnCollisionStay(Collision collision) 2{ 3 enemyObject = collision.gameObject; 4 // EnemyUndeadスクリプトの場合 5 EnemyUndead enemy = enemyObject.GetComponent<EnemyUndead>(); 6 // 直接hpフィールドを変更 7 enemy.hp = enemy.hp - 1; 8 // または、damageメソッドで処理を行う 9 enemy.damage(); 10}

EnemyControllerで複数のEnemyUndeadを一括管理しているなら

C#

1public EnemyController enemyController; // あらかじめ代入が必要 2void OnCollisionStay(Collision collision) 3{ 4 enemyObject = collision.gameObject; 5 // enemyControllerのdamageメソッドに渡してコントローラーに処理を任せる 6 enemyController.damage(enemyObject); 7}

他にもっと良い方法はあると思いますが一応こんな感じでしょうか?

投稿2016/09/11 04:40

buibui80

総合スコア1033

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

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

MujinSekai

2016/09/11 08:59

Playerオブジェクトの子オブジェクトであるRightCheckにCollisionDetectionスクリプトをアタッチしています。そのスクリプトに、 void OnCollisionStay(Collision collision) { Debug.Log (collision.gameObject.name); } と言う記述をしているので、EnemyUndeadオブジェクトに接触している場合、その名前が表示されるはずなんですが、反応がありません。 そこでやりたいのは、 隣接していてPlayerオブジェクトの正面にあるEnemyUndeadオブジェクトのHpフィールドの数値を変更する、 と言うことだったので、 エネミーが出現し、アタックメソッドを実行した段階でSceneにある(Hierarchy?)アクティブなオブジェクトの中でプレイヤーの正面の座標のオブジェクトを検索し、そのオブジェクトを取得した後でアタッチされたEnemyControllerのHpフィールドの数値を変更する、と言う手順でやりたい事はなんとか実現出来ました(今後、重くなる可能性もありますが……)。 しかしこれから先、OnCollisionStay()を使用する事は(現在製作中のゲームでは無かったにしても)多々あると思うので、使えていない現状はまずいと思います。提案して頂いた方法も試してみたのですが、うまくいきませんでした。なんらかの見落としがあると思うのですが……。 回答ありがとうございます。
buibui80

2016/09/11 11:13

そもそもですが、Physics2D.Linecastで衝突検知している場合は OnCollisionStayでなくPhysics2D.Linecastの戻り値(RaycastHit2D)から 対象GameObjectを特定しますがその辺の処理はどのようになっていますか?
MujinSekai

2016/09/11 14:59

回答ありがとうございます。 前に質問して教えて頂いた方法から、 bool rightCheck = Physics2D.Linecast (transform.position, objectRightCheck.position, BlockingLayer); としております。 衝突検知はスプライトが重ならないように(trueの時は移動しないようにして)います。
buibui80

2016/09/11 21:17

前の質問でコメントしたマニュアルURLに目を通してもらうと、 Physics2D.Linecastの戻り値はboolでなくRaycastHit2Dだと分かります。 http://docs.unity3d.com/jp/current/ScriptReference/Physics2D.Linecast.html 衝突の有無だけを確認する場合は戻り値がboolでもOKですが、 戻り値をRaycastHit2Dにしておけば衝突GameObjectを受け取ることができます。 http://docs.unity3d.com/jp/current/ScriptReference/RaycastHit2D-collider.html その衝突GameObjectのnameやtagなどで 地形オブジェクトか敵オブジェクトか判断して処理を分岐すれば良いかと思います。
MujinSekai

2016/09/12 00:49

おお、やはり私の理解の浅さ(見落とし)が原因だったようですね。 あればいいな〜という機能が標準であるとは。 RaycastHit2Dが何か全くわかっておりませんでした。 指摘、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問