void FixedUpdate() { //ДЕБАГ if (BackBall != null) { backType = BackBall.GetComponent <SphereBehaviour>().TypeSphere; } else { backType = TypesSphere.EMPTY; } if (FrontBall != null) { forwardType = FrontBall.GetComponent <SphereBehaviour>().TypeSphere; } else { forwardType = TypesSphere.EMPTY; } if (FrontBall != null && BackBall != null) { if (FrontBall == BackBall) { Debug.LogError("FrontBall == BackBall: " + FrontBall.GetComponent <SphereBehaviour>().TypeSphere); Destroy(gameObject); } } //ДЕБАГ Muving(); }
override internal void PlayerCheckToDestroy() { List <GameObject> destroyList = new List <GameObject>(); destroyList = BallController.GetBalls(RespIndex); destroyList.Add(gameObject); //Debug.Log("0_destroyList.count=" + destroyList.Count); BallController.lastForwardBallIndex = 0; if (FrontBall != null) { FrontBall.GetComponent <BallBehaviour>().CheckToDestroy(true, this); } else { BallController.readyToDestroy = true; //якщо передніх куль немає (і їх не потрібно зсувати) - то розблокувати процес знищення куль } if (BackBall != null) { BackBall.GetComponent <BallBehaviour>().CheckToDestroy(false, this); } else { BallController.readyToDestroy = true; //якщо задніх куль не має і зсуву передніх робити також не потрібно - то розблокувати процес знищення куль } }
/* void OnDestroy() * { * Debug.Log("OnDestroy()"); * if (FrontBall != null) * { * FrontBall.GetComponent<BallBehaviour>().IsLocalLastBall = true; * Debug.Log("OnDestroy() FRONT="+FrontBall.GetComponent<BallBehaviour>().TypeSphere); * } * }*/ virtual internal void PlayerCheckToDestroy() { List <GameObject> destroyList = new List <GameObject>(); destroyList = BallController.GetBalls(RespIndex); destroyList.Clear(); destroyList.Add(gameObject); if (FrontBall != null) { FrontBall.GetComponent <BallBehaviour>().CheckToDestroy(true, this); } if (BackBall != null) { if (BackBall.tag != "newBall" && BackBall.GetComponent <BallBehaviour>().CheckToDestroy(false, this)) { BallController.readyToDestroy = true; } else { destroyList.Clear(); } } else { destroyList.Clear(); } //BallController.blockPlayer = false; }
internal bool CheckToDestroy(bool isForward, SphereBehaviour sb) //виклик по ланцюгу перевірки на один колір { if ((sb.TypeSphere != TypeSphere && sb.TypeSphere != TypesSphere.MULCOLOR && TypeSphere != TypesSphere.MULCOLOR) || Health > 0) //перервати виконання, в разі якщо кулі не однакові { // Debug.Log("3 sb.TypeSphere != TypesSphere.MULCOLOR = " + sb.TypeSphere); return(false); } //Debug.Log("Add. forward="+ isForward +" Type="+TypeSphere); BallController.GetBalls(RespIndex).Add(gameObject); //Debug.Log("1_destroyList.count=" + BallController.GetBalls(RespIndex).Count); if (isForward) { if (FrontBall != null) { BallController.lastForwardBallIndex++; FrontBall.GetComponent <BallBehaviour>().CheckToDestroy(true, this); } } else if (BackBall != null) { BackBall.GetComponent <BallBehaviour>().CheckToDestroy(false, this); } return(true); }
public void MoveForwardBall() => MoveForwardBall(Speed, Step, false); //варіант, який використовує власну швидкість кулі public void MoveForwardBall(float speed, int step, bool isSmoothStart) //рекурсивний початок руху передніх куль { if (isSmoothStart) { StopAllCoroutines(); //в разі якщо буде плавний старт, то зупинити виконання інших корутин(може бути повторний старт тієї ж корутини з вильотом гри) } //Debug.Log("MoveForwardBall "+TypeSphere); if (FrontBall != null) //почати рух передньої кулі { if (FrontBall == BackBall) { Debug.LogError("задня та передня куля співпадають"); Destroy(gameObject); } FrontBall.GetComponent <BallBehaviour>().MoveForwardBall(speed, step, isSmoothStart); } if (isSmoothStart) { StartCoroutine(AccelerationCoroutine(speed, 0.25f, step)); } else { Move(speed, step); //продовжити рух самій } }
public GameObject SearchFirstBall() //Повернути першу кулю в послідовності. Не використовую { if (FrontBall != null) { return(FrontBall.GetComponent <BallBehaviour>().SearchFirstBall()); } else { return(gameObject); } }
/* public void MoveAndAlignBalls(float speed, int step, bool isSmoothStart) * { * if (FrontBall != null) * FrontBall.GetComponent<BallBehaviour>().MoveAndAlignBalls(speed, step, isSmoothStart); * Move(speed, step); * * if (BackBall != null) * { * float distance = Vector3.Distance(BackBall.transform.position, transform.position); * * if (distance < ((radius * 2) - 0.2f)) * { * MoveForwardBall(4.0f, 1); * StartCoroutine(AlignBallsCoroutine()); * } * } * }*/ public void ChangeSpeedForwardBalls(float Speed, bool changeBaseSpeed) //рекурсивна зміна швидкості без команди на початок руху { // Debug.Log("Speed "+TypeSphere); this.Speed = Speed; //Змінити швидкість без запуску руху if (changeBaseSpeed) { this.BaseSpeed = Speed; } if (FrontBall != null) { FrontBall.GetComponent <BallBehaviour>().ChangeSpeedForwardBalls(Speed, changeBaseSpeed); } //StopAllCoroutines(); }
public void StopForwardBall(bool isSmoothStop) //рекурсивна зупинка передніх куль { StopAllCoroutines(); if (FrontBall != null) //зупинити передню кулю { FrontBall.GetComponent <BallBehaviour>().StopForwardBall(isSmoothStop); } if (isSmoothStop) { StartCoroutine(AccelerationCoroutine(Speed, -0.15f, Step)); } else { Stop(true); //зупинитись самій } }
public int powerMulticolorSkill; //встановити при виклику з геймконтрола override internal void PlayerCheckToDestroy() { Debug.Log("BallMulticolor Type=" + TypeSphere); List <GameObject> destroyList = new List <GameObject>(); destroyList = BallController.GetBalls(RespIndex); //Debug.Log("powerMulticolorSkill="+powerMulticolorSkill); if (powerMulticolorSkill < 1) { destroyList.Add(gameObject); } else { destroyList.Add(null); } powerMulticolorSkill--; BallController.lastForwardBallIndex = 0; if (FrontBall != null) { FrontBall.GetComponent <BallBehaviour>().CheckToDestroy(true, this); } else { BallController.readyToDestroy = true; //якщо передніх куль немає (і їх не потрібно зсувати) - то розблокувати процес знищення куль } if (BackBall != null) { BackBall.GetComponent <BallBehaviour>().CheckToDestroy(false, this); } else { BallController.readyToDestroy = true; //якщо задніх куль не має і зсуву передніх робити також не потрібно - то розблокувати процес знищення куль } }
public override void CollisionOfBalls(GameObject collBall) { if (collBall.tag != "ball") //Тільки при ударі в кулю { return; } if (isCollidet) { base.CollisionOfBalls(collBall); //Якщо зіткнення вже відбувалось, то опрацьовувати як звичайну кулю return; } isCollidet = true; //Помітити що зіткнення відбулось, та викликати базову реалізацію angle = Mathf.Atan2((transform.position.y - collBall.transform.position.y), (transform.position.x - collBall.transform.position.x)); if (angle < 0) { angle += TPi; } GameObject collidetBall = collBall; collBallSb = collidetBall.GetComponent <BallBehaviour>(); // isTryClockwise = PathAngle(collBall) < 90? true: false; // Debug.Log(PathAngle(collBall)); //Три основні варіанти зіткнення - з заходом в перед кулі, в зад кулі та в перед кулі але з перенаправленням на задню кулю (для обрахунку більшості ударів одноманітним чином - з закотом проти часової стрілки) if (PathAngle(collBall) >= 90) //1. Удар в передню частину кулі { BackBall = collBall; collBallSb = BackBall.GetComponent <BallBehaviour>(); if (collBallSb.FrontBall != null) { FrontBall = collBallSb.FrontBall; //призначити передню кулю, якщо вона є FrontBall.GetComponent <BallBehaviour>().BackBall = gameObject; } collBallSb.FrontBall = gameObject; //призначити поточну кулю як нову передню для задньої } else if (collBallSb.BackBall != null) //2. Псевдо удар в задню частину кулі, який рахується як удар в передню частину задньої кулі { //Debug.Log("point 0"); FrontBall = collBallSb.gameObject; BackBall = collBallSb.BackBall; float beta = Mathf.Atan2((BackBall.transform.position.y - collBall.transform.position.y), (BackBall.transform.position.x - collBall.transform.position.x)); if (beta < 0) { beta += TPi; } if (beta < Mathf.PI) { angle = beta - (Mathf.PI * 4.0f / 3.0f); } else { angle = beta + Mathf.PI - (Mathf.PI / 3.0f); } collBallSb.BackBall = gameObject; collBallSb = BackBall.GetComponent <BallBehaviour>(); collBallSb.FrontBall = gameObject; isTryClockwise = PathAngle(collBallSb.BackBall) < 90 ? true : false; } else //3. Дійсний удар в задню частину кулі, якщо інших варіантів не лишилось(удар в хвіст потоку, або по одиночній кулі) { // isTryClockwise = true; isClockwise = true; //Debug.Log("REAL BACK"); FrontBall = collBall; collBallSb = FrontBall.GetComponent <BallBehaviour>(); if (collBallSb.BackBall != null) { BackBall = collBallSb.BackBall; BackBall.GetComponent <BallBehaviour>().FrontBall = gameObject; } collBallSb.BackBall = gameObject; } if (FrontBall != null && BackBall != null) //Якщо потрібно від'їхати вперед, та звільнити місце { FrontBall.GetComponent <BallBehaviour>().MoveOneStepForward(this); } pathPoints = new List <Transform>(collBallSb.pathPoints); RespIndex = collBall.GetComponent <BallBehaviour>().RespIndex; //отримує індекс списку куль }