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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

2回答

2238閲覧

クリックした際にダメージを与えるようにしたいです。

sundome

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2017/09/18 04:27

編集2017/09/19 06:46

2Dゲームで、左から流れてくる敵をクリックして倒すタワーディフェンスのようなゲームを作ろうと考えました。
左クリックをした時に、敵にダメージが入るように設定したいと思ったのですが、うまく行きませんでした。
当初はクリック一撃で破壊していたのですが、攻撃力があったほうが後々アップグレードしていくシステムを入れやすいかと思ってこのような形にしました。

初心者なので、読みづらいかもしれませんがご回答よろしくお願いします。

###発生している問題・エラーメッセージ

/Users/Assets/Script/ClickScript.cs(15,15): Warning CS0219: The variable `enemyscript' is assigned but its value is never used (CS0219) (Assembly-CSharp) /Users/Assets/Script/ClickScript.cs(21,21): Error CS0103: The name `enemyscript' does not exist in the current context (CS0103) (Assembly-CSharp) 上記がもう一つ

###ClickScript

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ClickScript : MonoBehaviour { 6 7 public GameObject explosion; 8 public int power = 100; 9 10 // 左クリックしたオブジェクトを取得する関数(2D) 11 private GameObject getClickObject() { 12 GameObject result = null; 13 // 左クリックされた場所のオブジェクトを取得 14 if(Input.GetMouseButtonDown(0)) { 15 Vector2 tapPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition); 16 Collider2D collition2d = Physics2D.OverlapPoint(tapPoint); 17 if (collition2d) { 18 result = collition2d.transform.gameObject; 19 } 20 } 21 return result; 22 } 23 void Start (){ 24 EnemyScript enemyscript = GetComponent<EnemyScript> (); 25 } 26 27 void Update () { 28 GameObject obj = getClickObject (); 29 if (obj != null) { 30 // 以下オブジェクトがクリックされた時の処理 31 enemyscript.hp = enemyscript.hp - power; 32 } 33 } 34} 35

###EnemyScript

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class EnemyScript : MonoBehaviour { 6 7 Rigidbody2D N_rigidbody2D; 8 public int speed = 3; 9 public int hp = 100; 10 public GameObject explosion; 11 12 void Start (){ 13 N_rigidbody2D = GetComponent<Rigidbody2D> (); 14 } 15 16 void Update (){ 17 N_rigidbody2D.velocity = new Vector2 (speed, N_rigidbody2D.velocity.y); 18 if(hp <= 0){ 19 Debug.Log("破壊された"); 20 Destroy(gameObject); 21 Instantiate (explosion, transform.position, transform.rotation); 22 } 23 } 24}

###補足情報(言語/FW/ツール等のバージョンなど)
Mac Sierra 10.12.6
Unity 2017 2.0b11

###9/19追記
2つの解決策を出していただいて、本当に助かりました!
ベストアンサーは迷ったのですが、投稿が早かったことと、僕がしょうもない迷惑をかけたということもあって今回はIShikawanにさせていただきました。
お二方とも、本当にありがとうございました。

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

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

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

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

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

guest

回答2

0

(a)

C#

1 void Start (){ 2 EnemyScript enemyscript = GetComponent<EnemyScript> (); 3 }

(b)

C#

1 // 以下オブジェクトがクリックされた時の処理 2 enemyscript.hp = enemyscript.hp - power;

(a)において、enemyscriptが関数の中で定義されているため、他の関数で使うことができません。
そのため、(b)でエラーとなります。

ついでに、(a)の場合だと、EnemyScriptが複数存在する場合に、どのEnemyScriptが使われるか分からなくなります。
それを踏まえると、(a)を削除した後、ClickScriptのUpdate()を以下のように修正したほうがよろしいと思います。

C#

1 void Update () { 2 GameObject obj = getClickObject (); 3 4 if (obj != null) { 5 EnemyScript enemyscript = obj.GetComponent<EnemyScript>(); 6 7 if (enemyscript != null) { // EnemyScriptの有無をチェック 8 // 以下オブジェクトがクリックされた時の処理 9 enemyscript.hp = enemyscript.hp - power; 10 } 11 } 12 }

IShikawanさんに先を越されましたが、エラーの原因について書かれていなかったので、とりあえず投稿しました。

投稿2017/09/18 07:22

fiveHundred

総合スコア9803

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

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

sundome

2017/09/18 09:16

言葉が足りず、不明瞭な中で適切なご回答、ありがとうございます! とてもわかりやすく、大変助かりました。 言われたとおりに書き直すと、うまくできました。 いつも本当にありがとうございます!
guest

0

ベストアンサー

###EnemyにRaycasterのあたり判定を持たせると楽です。
オブジェクトのタップをUpdateに処理を書くのではなくRaycasterに任せると楽に実装できます。 Raycasterを使う点は楽なだけではなく、判定をUnityのイベントに任せるので最適化された環境で処理を実行できます。それから、ゲームにUIがある場合Imageを持っていればオブジェクト同士が重なった場合、後ろのオブジェクトが反応しなくなるので前後関係を意識するだけで処理を止めたりできます。

[導入手順]

  1. カメラにPhysics 2D Raycasterをアタッチ

レイキャスター

  1. オブジェクトにCollider 2Dをアタッチ

コライダ

  1. [追記]EventSystemをHierarchyに追加

イベントシステム

  1. スクリプトにIPointerClickHandlerを実装

C#

1using UnityEngine; 2using UnityEngine.EventSystems; 3 4public class ClickObject : MonoBehaviour, IPointerClickHandler 5{ 6 public void OnPointerClick(PointerEventData eventData) 7 { 8 Debug.Log("クリックされました。"); 9 } 10}

###サンプルスクリプト
※検証する際はClickScriptを外してください。

C#

1using UnityEngine; 2using UnityEngine.EventSystems; 3 4public class EnemyScript : MonoBehaviour, IPointerClickHandler 5{ 6 7 Rigidbody2D N_rigidbody2D; 8 public int speed = 3; 9 public int hp = 100; 10 public GameObject explosion; 11 12 void Start() 13 { 14 N_rigidbody2D = GetComponent<Rigidbody2D>(); 15 } 16 17 void Update() 18 { 19 N_rigidbody2D.velocity = new Vector2(speed, N_rigidbody2D.velocity.y); 20 if (hp <= 0) 21 { 22 Debug.Log("破壊された"); 23 Destroy(gameObject); 24 Instantiate(explosion, transform.position, transform.rotation); 25 } 26 } 27 28 public void OnPointerClick(PointerEventData eventData) 29 { 30 //ダメージ処理 管理を考えるならシングルトンのクラスなどからPowerを参照するといいと思います。 31 hp -= 100; 32 } 33} 34

投稿2017/09/18 07:09

編集2019/02/08 11:56
IShix

総合スコア1724

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

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

sundome

2017/09/18 08:53

ご回答、ありがとうございます! 画像もあってすごくわかりやすいです! 手順の通り、Main CameraにPhysics 2D Raycasterを取り付け、EnemyScriptを書き換えてみましたが、敵を倒すことができませんでした。 クリックを認識していないのか、ダメージが入ってないのかわからないですが、調べて見ます。エラーなどは出ていません。 まだ理解が進んでいませんので、いじりながら勉強してみます。
IShix

2017/09/18 13:36

2. オブジェクトにCollider 2Dをアタッチ は敵にCollider 2Dをアタッチするということなんですが敵につけましたか?
sundome

2017/09/18 14:04

わざわざご返事ありがとうございます。 Box Collider2Dを付けていたので書き損じていました。 すでに敵に付けております。
IShix

2017/09/19 05:16

サンプルプロジェクトを作ってみたので追記しました。 必要な機能のみ入れたので分かりやすいと思います。
sundome

2017/09/19 06:42

ありがとうございます! サンプルの細かい所を見てもなにが違うか全然わからなかったのですが、EventSystemをHierarchyに入れたらすぐに動きました! 判定をUnityのイベントに任せるというものなんだから当たり前ですよね。 しょうもない見落としでお時間を取ってしまい、申し訳ありません。
IShix

2017/09/19 11:16 編集

なるほど!イベントシステムも必要ですね。 いつも入れているので全然気づいてませんでした。 申し訳ないです。追記もしました。
sundome

2017/09/19 22:21

いえいえ、とんでもございません! こんかいはありがとうございました。 今後とも、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問