Beispiel #1
0
    protected AudioSource CrashSound; //충돌음을 담는 변수
    //private



    //	  Use this for initialization
    protected void Start()
    {
        ////// 모든 공들이 공통적으로 초기화 해야하는 대상들
        main_scr         = GameObject.Find("GameObjects").GetComponent <Main_Script>(); //메인 스크립트 로딩
        _Sphere          = transform.gameObject;                                        //자기 자신
        CrashSound       = GetComponent <AudioSource>();                                //충돌음
        HP_prefab        = Resources.Load("Text_HP") as GameObject;                     //충돌시 HP증감 표시 글자
        pow              = new power_info(0f, 0f);                                      //힘 정보도 초기화
        cur_moving_state = moving_state.init;                                           //처음 상태
        ////// 공마다 다른 값을 가져야 할 대상들
    }
Beispiel #2
0
 public override void Start()
 {
     if (dest.y < transform.position.y)
     {
         middle.y = transform.position.y;
     }
     else
     {
         middle.x = transform.position.x;
     }
     state = moving_state.Start;
 }
Beispiel #3
0
 public void setDest(Vector3 _dest)
 {
     dest   = _dest;
     middle = _dest;
     if (_dest.y == transform.position.y)
     {
         state = moving_state.Middle;
     }
     else if (_dest.y < transform.position.y)
     {
         middle.y = transform.position.y;
     }
     else
     {
         middle.x = transform.position.x;
     }
     state = moving_state.Start;
 }
Beispiel #4
0
 public override void Update()
 {
     if (state == moving_state.Start)
     {
         transform.position = Vector3.MoveTowards(transform.position, middle, move_speed * Time.deltaTime);
         if (transform.position == middle)
         {
             state = moving_state.Middle;
         }
     }
     else if (state == moving_state.Middle)
     {
         transform.position = Vector3.MoveTowards(transform.position, dest, move_speed * Time.deltaTime);
         if (transform.position == dest)
         {
             state = moving_state.Stop;
         }
     }
 }
Beispiel #5
0
    //	  Update is called once per frame
    protected void Update()
    {
        if (cur_moving_state == moving_state.stop)
        {//공이 정지중일 때
            if (main_scr.allow_sp_control)
            {
                if (Input.GetMouseButtonDown(0))
                { //최초 클릭시
                    RaycastHit hit = new RaycastHit();
                    Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);

                    if (Physics.Raycast(ray.origin, ray.direction, out hit) &&
                        (hit.transform == _Sphere.transform))
                    {
                        cur_moving_state = moving_state.drag;
                        Click_pos        = Input.mousePosition;
                        Arrow            = _Sphere.transform.Find("Arrow").gameObject;
                        ArrowHead        = _Sphere.transform.Find("Arrow/Head").gameObject;
                        Arrow.SetActive(true);
                    }
                }
            }
        }
        else if (cur_moving_state == moving_state.drag)
        {     //화살표가 나타나고 드래그 중
            if (Input.GetMouseButtonUp(0))
            { //놓았을 때
                main_scr.allow_sp_control = false;
                cur_moving_state          = moving_state.drive;
                Arrow.SetActive(false);
                _Sphere.GetComponent <Rigidbody>().AddForce(new Vector3(-pow.scale * Mathf.Cos(pow.angle), 0f, pow.scale * Mathf.Sin(pow.angle)));

                diff = new Vector3(0, 0, 0);
                Arrow.transform.localScale = new Vector3(0, 0, 0);
            }
            else  //계속 드래그 중일때
            {
                Current_pos = Input.mousePosition;
                diff        = Current_pos - Click_pos;

                pow.angle = -Mathf.Atan2(diff.y, diff.x);

                pow.scale = Mathf.Min(Mathf.Sqrt(diff.x * diff.x + diff.y * diff.y) / 50 * MAX_POWER, MAX_POWER);

                Arrow.transform.rotation = Quaternion.Euler(90f, pow.angle * Mathf.Rad2Deg - 90f, 0f);

                Arrow.transform.localScale = new Vector3(1, (2 * pow.scale) / MAX_POWER, 1);
                //자식 오브젝트까지 같이 키워버려서 원래대로 되돌린다..??
                if (pow.scale > 0)
                {
                    ArrowHead.transform.localScale = new Vector3(1, MAX_POWER / (2 * pow.scale), 1);
                }
                Debug.Log(pow.angle + " " + pow.scale);
            }
        }
        else if (cur_moving_state == moving_state.drive)
        {     //공이 움직이는 중
            if (_Sphere.GetComponent <Rigidbody>().velocity.magnitude < 1)
            { //속력이 일정 미만으로 내려가면
                cur_moving_state = moving_state.stop;
                main_scr.turn_over();
                main_scr.allow_sp_control = true;
            }
        }
    }
Beispiel #6
0
    protected void OnCollisionEnter(Collision collisioninfo)
    {
        if (cur_moving_state == moving_state.init)
        {
            cur_moving_state = moving_state.stop;
            return;
        }
        //충돌시 카메라를 흔든다. - 오픈소스 이용
        main_scr.Main_Cam.GetComponent <Cam_Mov>().shake       = _Sphere.GetComponent <Rigidbody>().velocity.magnitude / 10;
        main_scr.Main_Cam.GetComponent <Cam_Mov>().shakeAmount = _Sphere.GetComponent <Rigidbody>().velocity.magnitude / 200;
        //충돌시 소리를 재생한다.
        CrashSound.volume = _Sphere.GetComponent <Rigidbody>().velocity.magnitude / 200;
        CrashSound.PlayOneShot(CrashSound.clip);

        //데미지 표시 글자를 뿌려줄 위치. 이거 정확한 위치를 어떻게 가져오지
        Vector3 pos = new Vector3(0.22f + 0.5f * (_Sphere.transform.localPosition.x + 4.23f) / 8f, 0.07f + 0.89f * (_Sphere.transform.localPosition.z + 5.26f) / 9.06f, 0);


        //데미지를 입어야 하는 물체와 충돌
        if (collisioninfo.gameObject.tag == "Damaging_Objects")
        {
            Debug.Log(collisioninfo.gameObject.name);

            //충돌시 데미지를 입는다.
            int damage = Mathf.RoundToInt(_Sphere.GetComponent <Rigidbody>().velocity.magnitude / 3);

            //HP의 범위는 0~
            if (HP > 0)
            {
                HP = HP - damage;
            }
            else
            {
                HP = 0;
            }

            //공이 위치하는 곳에 체력 감소 수치를 뿌린다.
            if (damage > 0)
            {
                GameObject Player_HP = Instantiate(HP_prefab) as GameObject;
                Player_HP.GetComponent <GUIText>().text       = "-" + damage;
                Player_HP.GetComponent <Transform>().position = pos;
            }
        }
        //회복되는 물체와 충돌
        else if (collisioninfo.gameObject.tag == "Healing_Objects")
        {
            int healing_amount = Mathf.RoundToInt(_Sphere.GetComponent <Rigidbody>().velocity.magnitude / 4);
            if (HP + healing_amount < MAX_HP)
            {
                HP = HP + healing_amount;
            }
            else
            {
                HP = MAX_HP;
            }
            //공이 위치하는 곳에 체력 증가 수치를 뿌린다.
            GameObject Player_HP = Instantiate(HP_prefab) as GameObject;
            Player_HP.GetComponent <GUIText>().text       = "+" + healing_amount;
            Player_HP.GetComponent <Transform>().position = pos;
        }

        //이외의 물체와 충돌
        else
        {
        }


        //구체의 밝기는 HP에 비례한다.
        Light lt = _Sphere.transform.Find("Point light").gameObject.GetComponent <Light>();

        lt.intensity = 8 * HP / MAX_HP;
    }
Beispiel #7
0
 public void reset()
 {
     state = moving_state.Stop;
 }
Beispiel #8
0
 void Awake()
 {
     state = moving_state.Stop;
 }