Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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);//사망원인
        }
    }
Exemplo n.º 3
0
 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;
     }
 }
Exemplo n.º 4
0
    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);
    }
Exemplo n.º 5
0
 public override void ActBegin()//액션 시작
 {
     isNewBall  = false;
     boss       = GameManager.I().boss;
     startPos.x = Mathf.Sign(SoccerStageManager.I().player.position.x) * 4.5f;
 }
Exemplo n.º 6
0
    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);
            }
        }
    }