using System.Collections; using System.Collections.Generic; using UnityEngine; public class Target : MonoBehaviour { //ゲームマネージャー GameManager manager; Team team; //ターゲットにする選手を格納 public GameObject target_player; //計算用 private int target_teamNum; //フレームカウント用 private int flame = 0; //試作で固定型ターゲット void Start() { //各情報を取得 manager = GameObject.Find("Manager").GetComponent(); team = GetComponent(); //チームを逆にする target_teamNum = team.teamNum + 1; if (target_teamNum != 1) target_teamNum = 0; Invoke("init_target", 0.1f); } //プレイヤーが操作している場合、近くにいる選手をマークしているという認識をさせる void Update() { if (!manager.IsGamePlayOK()) return; flame++; if (GetComponent().IsPlayerOperating() && flame == 100) { search_target(); flame = 0; } } //一回のみ呼び出す void init_target() { target_player = manager.teamList[target_teamNum].member[team.memberNum]; //ゲームマネージャーに情報を送る manager.markList[team.teamNum].target[team.memberNum] = target_player; } //近くの「相手」選手をマークする public void search_target() { float tmpDis = 0; //距離用一時変数 float nearDis = 0; //最も近いオブジェクトの距離 int teamNo = team.teamNum; //自分のチーム int mynum = team.memberNum; //自分の(メンバー)ナンバー GameObject targetObj = null; //オブジェクト //相手チームに入れ替え if (teamNo == 1) teamNo = 0; else teamNo = 1; for (int num = 0; num < 3 && manager.teamList[teamNo].member[num] != null; num++) { if (manager.teamList[teamNo].member[num] != gameObject) { //自身と取得したオブジェクトの距離を取得 tmpDis = Vector3.Distance(manager.teamList[teamNo].member[num].transform.position, gameObject.transform.position); //オブジェクトの距離が近いか、距離0であればオブジェクト名を取得 //一時変数に距離を格納 if (nearDis == 0 || nearDis > tmpDis) { nearDis = tmpDis; targetObj = manager.teamList[teamNo].member[num]; } } } //計算式でオブジェクトを取得できなかった場合エラー文を返す if (targetObj == null) { Debug.Log("オブジェクト取得失敗"); return; } //成功した場合はそのオブジェクトをset_targetに送り変更する else { set_target(targetObj); } } //マークする選手をリセットする public void reset_target() { Start(); } //引数で送られてきたオブジェクト(選手)をマークする //マークしてる人が既に2人いた場合命令を無効化する public void set_target(GameObject target) { int teamNo = team.teamNum; //相手のチーム //相手チームに入れ替え if (teamNo == 1) teamNo = 0; else teamNo = 1; int i = 0; //ターゲットしようとしている人が現在何人にマークされているか int targetcount = 0; while (manager.markList[teamNo].target[i] != null) { //マークしている選手が自分かどうか判断 if (manager.markList[teamNo].target[i] == target) targetcount++; i++; } if (targetcount < 1) { target_player = target; //ゲームマネージャーに情報を送る manager.markList[team.teamNum].target[team.memberNum] = target_player; } } //自分がマークされているかどうかを返す //true = 自分は誰かにマークされている //false = 自分はだれにもマークされていないフリーな状態 public bool search_mark() { int teamNo = team.teamNum; //相手のチーム //相手チームに入れ替え if (teamNo == 1) teamNo = 0; else teamNo = 1; int i = 0; while (manager.markList[teamNo].target[i] != null) { //マークしている選手が自分かどうか判断 if (manager.markList[teamNo].target[i] == GameObject.Find(gameObject.name)) return true; i++; } return false; } }