using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ball : MonoBehaviour { //コンポーネント GameManager gmanager; FlagManager flag; //コートのオブジェクト GameObject coat; //コートの広さ 右上端の座標から広さを読み取る public float bleadthCoatX = 0f; public float bleadthCoatZ = 0f; //シュート判定 public bool shoot = false; //ドリブル中の往復切り替え用 bool isYminus = true; //判定用 int myteam; //初期設定 void Start() { flag = GameObject.Find("Manager").gameObject.GetComponent(); coat = GameObject.Find("coat").gameObject; gmanager = GameObject.Find("Manager").GetComponent(); //0830 ジャンプボール*********************************** var body = GetComponent(); body.useGravity = false; Invoke("Jump", 0.6f); Invoke("Gravity", 0.5f); Invoke("Callwhichball", 1.6f); //****************************** } // Update is called once per frame void Update() { //ゲームプレイの許可が出ていない間は処理しない if (!gmanager.IsGamePlayOK()) return; //あたり判定のため var body = GetComponent(); body.WakeUp(); //7/20スロー再生 if (flag.shootsuccess) { Time.timeScale = flag.slow; } if (!flag.shootsuccess) { Time.timeScale = flag.normal; } //ボールがコート内にあって、foulがtrueのとき if (flag.foul && (Mathf.Abs(transform.position.x - coat.transform.position.x) < bleadthCoatX && Mathf.Abs(transform.position.z - coat.transform.position.z) < bleadthCoatZ)) { flag.foul = false; } //ボールがコートの外に出たとき if (!flag.foul && !flag.fieldGoal && (Mathf.Abs(transform.position.x - coat.transform.position.x) > bleadthCoatX || Mathf.Abs(transform.position.z - coat.transform.position.z) > bleadthCoatZ)) { flag.OutOfBounds(); } if (shoot) { transform.Rotate(0, 0, 1); } } //プレイヤーのアニメーションに合わせてボールを 手 ←→ 地面 のように往復させる public void dribble(Vector3 playerHandPos, int flame) { float distance = Vector3.Distance(playerHandPos, new Vector3(playerHandPos.x, 0.3f, playerHandPos.z));//床とプレイヤーの手の距離 float flameMove = distance / (flame / 2);//1フレームごとの移動量 //ボールの位置をプレイヤーの手の位置へ transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z); //往復 if (isYminus) { //手 → 地面へ transform.Translate(Vector3.up * -flameMove); if (transform.position.y <= 0.3f + 1f) { //transform.position = new Vector3(playerHandPos.x, 0.3f+0.5f, playerHandPos.z); transform.position = new Vector3(transform.position.x, 0.3f + 0.5f, transform.position.z); isYminus = false; } } else { //地面 → 手へ transform.Translate(Vector3.up * flameMove); if (transform.position.y >= playerHandPos.y) { transform.position = playerHandPos; isYminus = true; } } } //-------------------------------------------------------------------------- //----------------------------------------------------------------- //複数のプレイヤーにボール所持が起こらないようにする::ボールを所持したPlayerより呼び出される //----------------------------------------------------------------- public void HaveBallPlayerOrgange() { GameObject.Find("Manager").GetComponent().HaveBallPlayerOrgange(this.transform); } //Playerから呼び出される。シュート判定をtrueにする public void shootTrue() { shoot = true; } //シュート時、ゴールに当たったらシュート終了 IEnumerator OnCollisionEnter(Collision c) { if (!shoot) yield break; if(LayerMask.LayerToName(c.gameObject.layer) == "Goal" || LayerMask.LayerToName(c.gameObject.layer) == "coat") { shoot = false; //GameObject.Find("Manager").gameObject.GetComponent().shootEndCameraAction(); GetComponent().isKinematic = true; yield return null; GetComponent().isKinematic = false; } if (GameObject.Find("Main Camera").GetComponent().cameraType == 0) yield break; if (LayerMask.LayerToName(c.gameObject.layer) == "coat") { GameObject.Find("Main Camera").GetComponent().cameraType = 0; } } //0830 ジャンプボール***************************** void Jump() { var body = GetComponent(); body.AddForce(transform.up * 240, ForceMode.Impulse); } void Gravity() { GetComponent().useGravity = true; } void Callwhichball() { //どちらのチームに飛ぶか 0または1で判定 myteam = Random.Range(0, 2); //値渡し whichball(myteam); } //どちらに飛ぶかの処理 void whichball(int myteam) { var body = GetComponent(); //はじいた選手に当たらないように当たり判定を一時的に無効に GetComponent().enabled = false; //どちらに飛ぶか分岐 if (myteam == 0) { body.AddForce(transform.forward * 8000); } else { body.AddForce(transform.forward * -8000); } Invoke("SphereColliderOn", 0.5f); } //判定を戻す void SphereColliderOn() { GetComponent().enabled = true; } //************************************************** }