using System.Collections; using System.Collections.Generic; using UnityEngine; //自身がボールを所持しているとき、敵プレイヤーに接近されると一定時間後にボールを手放す public class PlayerActionSteel : MonoBehaviour { //親オブジェクトの情報、チームの番号 [SerializeField] GameObject parent; int parentTeamNum; bool isSteel = false;//ブロックされている List colEnterEnemy = new List();//当たっている敵プレイヤーのリスト void Start() { parentTeamNum = parent.GetComponent().teamNum; } void OnTriggerEnter(Collider c) { if (!parent.GetComponent().have_ball) return; Debug.Log("衝突" + c.gameObject.name); GameObject enterObj = c.gameObject; //当たった相手のオブジェクトとチームの判定をする if (LayerMask.LayerToName(parent.layer) == "Player") { if (LayerMask.LayerToName(enterObj.layer) != "EnemyPlayer") return;//プレイヤー判定 } else if(LayerMask.LayerToName(parent.layer) == "EnemyPlayer") { if (LayerMask.LayerToName(enterObj.layer) != "Player") return;//プレイヤー判定 } if (enterObj.GetComponent().teamNum == parentTeamNum) return;//チーム判定 colEnterEnemy.Add(enterObj); Debug.Log("Steel開始" + parent.name); if (isSteel) return; isSteel = true; StartCoroutine(steel()); } void OnTriggerExit(Collider c) { GameObject exitObj = c.gameObject; //当たった相手のオブジェクトとチームの判定をする if (LayerMask.LayerToName(exitObj.layer) != "EnemyPlayer") return;//プレイヤー判定 if (exitObj.GetComponent().teamNum == parentTeamNum) return;//チーム判定 //どの敵が当たり判定から外れたかを判定 for (int i = 0; i < colEnterEnemy.Count; i++) { if (exitObj.name == colEnterEnemy[i].name) { colEnterEnemy.RemoveAt(i);//一致したオブジェクトをリストから削除 break; } } } //一定時間後にボールを手放す IEnumerator steel(){ float frameCount = 0;//フレームカウント //breakされるまでループ while (true) { //Debug.Log("Steel時間 = " + frameCount); frameCount += 1f * Time.deltaTime; //接近している敵プレイヤーがいなければ処理を終了 if(colEnterEnemy.Count <= 0){ isSteel = false; break; } //3秒経過 if(frameCount >= 3f){ //ボールを手放す処理 parent.GetComponent().steeler(); //初期化 isSteel = false; break; } yield return null; } } }