public override void ActAllWay()//업데이트 { Vector2 bp = boss.transform.position; Vector2 pp = boss.transform.position; pp.x = SoccerStageManager.I().player.position.x; boss.transform.position = Vector2.MoveTowards(bp, pp, 5 * Time.deltaTime); }
void LateUpdate() { transform.position += (Vector3)dir * speed * Time.deltaTime; if (Mathf.Abs(transform.position.x) > SoccerStageManager.I().area.x || Mathf.Abs(transform.position.y) > SoccerStageManager.I().area.y) { gameObject.SetActive(false);//사망원인 } }
public override void ActBegin()//시작 위치 { Dash = true; if (!isStartOnPlayer) { startPos.x = Mathf.Sign(SoccerStageManager.I().player.position.x) * 4.5f; } else { startPos.x = GameManager.I().player.position.x; } }
public override void ActTrigger()//새 칠드런을 생성하거나 발사하거나 { //자식 만들기 isNewChild = !isNewChild; if (isNewChild) { soccerC = (GameManager.I() as SoccerStageManager).GetSoccerChild(); soccerC.Init(Vector2.zero, 0, false); soccerC.transform.position = Vector2.zero; GameManager.I().PlaySound((GameManager.I() as SoccerStageManager).sound_BossChild_Dirt);//자식 나오는 소리 return; } //발차기 Vector2 dir = (SoccerStageManager.I().player.position - soccerC.transform.position).normalized; soccerC.Init(dir, ballSpeed, true); }
public override void ActBegin()//액션 시작 { isNewBall = false; boss = GameManager.I().boss; startPos.x = Mathf.Sign(SoccerStageManager.I().player.position.x) * 4.5f; }
private Vector2 lastnormal; //마지막으로 만났던 노말 private void LateUpdate() { curTime -= Time.deltaTime; if (curTime <= 0) { gameObject.SetActive(false); } curSpeed = Mathf.Lerp(0, speed, curve.Evaluate(curTime / time)); curColor.a = Mathf.Lerp(0, 1, curve.Evaluate(curTime / time)); spriteR.color = curColor; transform.localScale = Vector3.Lerp(Vector3.zero, startScale, curve.Evaluate(curTime / time)); transform.Translate(dir * curSpeed * Time.deltaTime, Space.World);//움직임 if (Mathf.Abs(transform.position.x) > SoccerStageManager.I().area.x || Mathf.Abs(transform.position.y) > SoccerStageManager.I().area.y) { gameObject.SetActive(false); //사망원인 } //RaycastHit2D hit = Physics2D.CircleCast(transform.position, radius, Vector2.zero, radius + speed * Time.deltaTime, mask);//충돌체크 어디가서 끼이지 않게 충돌범위 넉넉하게 줌(속도에 따라서) RaycastHit2D hit = Physics2D.Raycast((Vector2)transform.position + (dir * (radius * 0.5f)), dir, radius + curSpeed * Time.deltaTime, mask); if (hit) { if (lastnormal == hit.normal) { return; //저번 노말과 같으면 리턴 } if (hit.collider.gameObject.layer == 14 && dir.y > 0) { return; //플레이어 플랫폼에 부디치는데 올라가고 있다면 } lastnormal = hit.normal; //노말과 이동각도의 차이가 90도 이하면 무시하고 리턴 float Bangle = Mathf.Atan2(dir.x, dir.y) * -180 / Mathf.PI; //공 각도 float Nangle = Mathf.Atan2(lastnormal.x, lastnormal.y) * -180 / Mathf.PI; //충돌 각도 //angle = Bangle; //Debug.Log(Bangle.ToString() + " " + Nangle.ToString()); //Debug.Log(Mathf.DeltaAngle(Bangle, Nangle)); //Debug.Log(Mathf.Abs(Bangle - Nangle)); //Debug.Break(); if (Mathf.Abs(Bangle - Nangle) < 90) { return; } dir = dir + hit.normal * (-2 * Vector2.Dot(dir, hit.normal));//반사각 구함 dir.Normalize(); transform.Translate(dir * curSpeed * Time.deltaTime, Space.World);//추가 움직임 //전에 부닷친게 이번이랑 같은 콜리더라면 방향은 꺽되 데미지는 주지말자 if (lastcoll != null && hit.collider.gameObject == lastcoll.gameObject) { return; } lastcoll = hit.collider; //적과의 조우 if (hit.collider.gameObject.layer == 12) { if (hit.collider.CompareTag("Boss"))//보스 { GameManager.I().boss.Hit(1); GameManager.I().AddCombo(5); } else if (hit.collider.CompareTag("Barrier"))//커여운 배리어씨 { hit.collider.GetComponent <Barrier>().Hit(1); } } //반사 횟수 제한 curReflecTime++; if (curReflecTime >= reflecTime) { gameObject.SetActive(false); } GameManager.I().PlaySound(GameManager.I().sound_Ball_Hit);//사운드 } else//뒤에서 오는 물체 { hit = Physics2D.Raycast(transform.position * (-dir * (radius * 0.5f)), -dir, radius * 0.5f, mask); if (hit) { if (lastnormal == hit.normal) { return; //저번 노말과 같으면 리턴 } lastnormal = hit.normal; dir = Vector2.Lerp(dir, hit.normal, 0.5f); dir.Normalize(); //transform.position = (hit.point + dir * radius); } } }