using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraAction : MonoBehaviour { Vector3 startPoint; //開始位置 Vector3 middlePoint; //方向点 Vector3 goalPoint; //終点 Transform charBallTrans; Transform ballTrans; float t = 0f; //時間(スピードに影響する) float additionDegree_t = 0.05f; //移動時間の加算度 //bool isShootEnd = false; //シュートしようとしているプレイヤーにズームする準備(曲線) public void zoomInCamera() { Debug.Log("zoomInCamera開始"); startPoint = transform.position; //開始地点 middlePoint = directionPointCalc(startPoint, goalPoint);//方向点 charBallTrans = GetComponent().charBall.transform;//ボールを所持しているプレイヤーの情報 ballTrans = GameObject.Find("ball").transform; //ボールの情報 goalPoint = charBallTrans.FindChild("CameraActionGoalPoint").transform.position;//ゴール地点 //ズームイン開始 StartCoroutine(zoomInCameraBezier(charBallTrans.position, startPoint, middlePoint, goalPoint)); Debug.Log("すべてのカメラ移動終了"); } //方向点の計算 Vector3 directionPointCalc(Vector3 startPos, Vector3 goalPos) { //中間地点加算分 Vector3 midPosAdd = (goalPos - startPos) / 2f; //実際の中間地点 ///////////////////////////////////////////// //注意::攻守によってz軸が逆になるため、判定による使い分けが必要 ///////////////////////////////////////////// Vector3 midPos = startPos + midPosAdd; //xが正の値か負の値かによって右回りか左回りかを決める if(goalPoint.x >= 0) { //正。右回りのためxを加算する //カメラが右にあるほどさらに追加する midPos.x += startPos.x; } else { //負。左回りのためxを減算する //カメラが左にあるほどさらに引く midPos.x -= startPos.x; } return midPos; } //曲線に沿ってプレイヤーにズームインする IEnumerator zoomInCameraBezier(Vector3 lookAtPos, Vector3 startPos, Vector3 middlePos, Vector3 endPos) { while (Vector3.Distance(transform.position, endPos) > 0.2f) { t += additionDegree_t; //時間経過させる float t1 = (1 - t); float t2 = t1 * t1; //曲線の計算(3点、方向点(middlePoint)に依存した曲線) float x = t2 * startPos.x + 2 * t1 * t * middlePos.x + t * t * endPos.x; float y = t2 * startPos.y + 2 * t1 * t * middlePos.y + t * t * endPos.y; float z = t2 * startPos.z + 2 * t1 * t * middlePos.z + t * t * endPos.z; transform.LookAt(new Vector3 (lookAtPos.x, lookAtPos.y + 3f, lookAtPos.z)); transform.position = new Vector3(x, y, z); if (t >= 1f) //tが1になった時にはゴールに到達している { //終了 break; } yield return null; } t = 0; //処理が完了したので、ボールに追従させる StartCoroutine(lookBallAnim()); Debug.Log("zoomInCameraBezier終了"); //GetComponent().setBallShootingAction(false); } //ボールを見ながら追従 IEnumerator lookBallAnim() { Vector3 dis = ballTrans.position - transform.position; while (ballTrans.position.y <= 2f) { transform.LookAt(ballTrans.position); transform.position = new Vector3(ballTrans.position.x - dis.x, ballTrans.position.y + dis.y, ballTrans.position.z - dis.z); yield return null; } while(ballTrans.position.y > 2f) { transform.LookAt(ballTrans.position); transform.position = new Vector3(ballTrans.position.x - dis.x, ballTrans.position.y + dis.y, ballTrans.position.z - dis.z); yield return null; } /* while (!isShootEnd) { transform.LookAt(ballTrans.position); transform.position = new Vector3(ballTrans.position.x - dis.x, ballTrans.position.y + dis.y, ballTrans.position.z - dis.z); yield return null; } */ animationEnd(); //isShootEnd = false;//初期化 Debug.Log("lookBallAnim終了"); } //追従が終了して元の位置に戻る void animationEnd() { //GetComponent().setBallShootAction(false);//シュートが終わったのでカメラを通常の動作に戻す //Vector3 mid = directionPointCalc(startPoint, transform.position); //StartCoroutine(zoomInCameraBezier(ballTrans.position, transform.position, mid, startPoint)); transform.position = startPoint; transform.LookAt(ballTrans.position); Debug.Log("animationEnd終了"); } /* * //-------------------------------------------------------------------------- //gameManagerから呼び出される。シュートでボールがゴールか地面に衝突したのでカメラの処理を終了する public void shootEnd() { isShootEnd = true; } //-------------------------------------------------------------------------- */ }