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

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

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

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

Q&A

解決済

1回答

679閲覧

一番近い敵をロックオンする方法

nissei

総合スコア35

C#

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

0グッド

1クリップ

投稿2017/06/28 10:29

教科書を見ながらコードを記述しているのですが何故かエラーが出てしまします。原因を調べたところ使用できないコードでバージョンが古いそうです(教科書のサンプルが古い)、ですので敵が数体いる場所で自身から一番近い敵をロックオンするにはどうすればいいでしょうか??
御教授願いたいです。

public class LockOn : MonoBehaviour {

GameObject target = null; // Use this for initialization void Start () { } // Update is called once per frame void Update() { if (Input.GetButtonDown("Lock")) { //ロックを解除する if (target != null) target = null; else //一番近いターゲットを取得する taregt = FindClosestEnemy(); ←ここでエラー //ターゲットを取得 //target = GameObject.FindWithTag("Enemy"); } if(target != null) { //ターゲットの方を向く //transform.LookAt(target.transform); //スムーズにターゲットの方を向く Quaternion targetRotation = Quaternion.LookRotation (target.transform.position - transform.position); transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, Time.deltaTime * 10); transform.rotation = new Quaternion (0, transform.rotation.y,0, transform.rotation.w); //カメラをターゲットに向ける Transform cameraParent = Camera.main.transform.parent; Quaternion targetRotation2 = Quaternion.LookRotation (target.transform.position - cameraParent.position); cameraParent.localRotation = Quaternion.Slerp (cameraParent.localRotation, targetRotation2, Time.deltaTime * 10); cameraParent.localRotation = new Quaternion(cameraParent.localRotation.x, 0, 0, cameraParent.localRotation.w); } //一番近い敵を探して取得 GameObject FindClosestEnemy() { ←ここでエラー //GameObject.FindWithTag("Enemy"); //{ GameObject[] gos; gos = GameObject.FindGameObjectsWithTag("Enemy"); GameObject closest = null; float distance = Mathf.Infinity; Vector3 position = transform.position; foreach(GameObject go in gos) { Vector3 diff = go.transform.position - position; float curDistance = diff.sqrMagnitude; if(curDistance < distance) { closest = go; distance = curDistance; } } } } }

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

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

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

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

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

YAmaGNZ

2017/06/28 11:06

unityタグを付けたほうがいいと思います。また、コードは```で囲んでください。
nissei

2017/06/28 11:39

初めての事で何かと不手際があり、読みにくい文面を記載してしまい、申し訳ありません。今後からは改善出来るようにします!Unityタグはたしかにですね!?ありがとうございました。
guest

回答1

0

ベストアンサー

まず、1つ目のエラーについては変数名の誤りのように思われます。

また、2つ目のエラーは「機能'ローカル関数'は...」のようなメッセージが出るということでしょうか?
そうであれば、それは関数の中で関数を定義しようとしていることによるかと思います。
{}が正しく対応づけられているかご確認ください。

もう一点、FindClosestEnemy()は、最も近い敵が見つかったら、その敵をreturnで返すべきではないでしょうか?もしFindClosestEnemy()に関して、「値を返さないコードパスが...」といったメッセージが表示されるようであれば、これも修正する必要があるかと思います。

もし教科書通りに書いてこうなるようでしたら、もしかすると教科書の記述の誤りかもしれません。

投稿2017/06/28 11:16

Bongo

総合スコア10807

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

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

nissei

2017/06/28 11:37

ありがとうございます。参考にさせてもらいます。 指摘の点を踏まえて試行錯誤してみます!! 今後もよろしくお願いします。
nissei

2017/06/28 12:04

一個目のエラーに関してはレッドラインによるエラー警告は消え、二個目の方に関しては「ローカル関数はC#4では使用できません。7以上の言語バージョンを使用してください」と出ました。 ちなみに使っているのはビジュアルスタジオ2017なんですけど、コレは一体どうゆう。。。??
Bongo

2017/06/28 12:24

つまり、関数の終わりの「}」の位置が誤っていないかということです。元の教科書ですと、「cameraParent.localRotation.w);」から「GameObject FindClosestEnemy() {」までの間に、「}」が2つ入っていませんでしょうか? ※ちなみに、C#7ではメソッドの中で関数を定義して、そのメソッドの中だけで使える関数を作ることができますが、UnityではまだC#4までしか使えないために、このようなメッセージが出ております。
nissei

2017/06/29 14:58

{} の数と位置を調整してもうまくいかないですね。 GameObject FindClosestEnemy() の部分を target = GameObject.FindWithTag("Enemy"); に変更したところエラーは解消させたので一度コレで進めてみます! 本当にありがとうございました!!
nissei

2017/07/05 15:26

途中で書いてる内に {}の場所が原因だったことに偶然ですが発見して無事この点は解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問