Project/Alice Project

Spider Hunting

Red_Horse 2022. 2. 13. 04:18

 

거미 위치를 받기 위한 객체

namespace spider
{
    public class Random_position : MonoBehaviour
    {
        public GameObject spyder;
        public GameObject spider;
        public GameObject Player;
        public Transform[] transform_list;

        void Start()
        {
            InvokeRepeating("Spyder_position", 1f, 30f);
        }

        public void Spyder_position()
        {
            spyder.SetActive(false);
            int position_num = Random.Range(0, transform_list.Length);
            spider.transform.position = transform_list[position_num].transform.position;
            spyder.SetActive(true);
        }
    }
}

1. 기존에 받아온 위치값들 중 하나의 위치를 거미의 위치로 할당

2. 거미 오브젝트 Active

 

 

 

거미 이동 및 애니메이션을 실행하기 위한 객체

 

namespace spider
{
    public class Spyder_LookRotation : MonoBehaviour
    {
        Vector3 relativerPosition;
        Quaternion playerRotation;

        public GameObject Spyder_body;
        public Transform target;
        public Animator Spyder;
        public GameObject[] eyes;
        public Random_position reset_position;
        public GameObject Player;

        private int eyes_attack = 0;
        public float r_speed = 0.1f;
        public float m_speed;

        bool rotating = false;
        bool walking = false;

        float wait;
        float rotationTime;

        void Start()
        {
            foreach (GameObject black_eyes in eyes)
                black_eyes.SetActive(false);
        }

        private void OnEnable()
        {
            wait = Random.Range(0, 5);
            rotationTime = 0;
            rotating = true;
            Spyder.Play("Spyder.IdleLookAroundNormal", 0, 1f);
            StartCoroutine(Wait_time());
        }

        private void OnDisable()
        {
            Spyder.StopPlayback();
        }

        IEnumerator Wait_time()
        {
            yield return new WaitForSeconds(wait);
            Spyder.speed = 0.5f;
            StartCoroutine(rotate_delay());
        }

        // Update is called once per frame
        void FixedUpdate()
        {
            relativerPosition = target.position - Spyder_body.transform.position;
            playerRotation = Quaternion.LookRotation(relativerPosition);
            if (rotating)
            {
                rotationTime += Time.deltaTime * r_speed;
                Spyder_body.transform.rotation = Quaternion.Lerp(Spyder_body.transform.rotation, playerRotation, rotationTime);
            }

            if (walking)
            {
                Spyder_body.transform.position += Spyder_body.transform.forward * Time.deltaTime * m_speed;
            }
        }

        void Walk()
        {
            Spyder_body.transform.position += Spyder_body.transform.forward * Time.deltaTime * m_speed;
        }

        void Check_Input()
        {
            StartCoroutine(Move_timer());
        }

        IEnumerator rotate_delay()
        {
            yield return new WaitForSeconds(1f);
            Check_Input();
        }

        IEnumerator Move_timer()
        {
            Spyder.StopPlayback();
            walking = true;
            Spyder.Play("Spyder.CrawlNormal", 0, 1f);
        }

        private void OnTriggerEnter(Collider other)
        {
            if (other.tag == "Player")
            {
                walking = false;
                Spyder.StopPlayback();
                Spyder.Play("Spyder.ThrowSpiderWebThreat", 0, 0.25f);
                StartCoroutine(Spider_Attack());
            }

            else if (other.tag == "Bullet")
            {
                if (eyes_attack <= eyes.Length)
                {
                    Spyder.Play("Spyder.DeathNormal", 0, 0.25f);
                    eyes[eyes_attack].SetActive(true);
                    eyes_attack++;
                    StartCoroutine(spider_hit());
                }
            }
        }

        IEnumerator Spider_Attack()
        {
            walking = false;
            yield return new WaitForSeconds(2.0f);
            Spyder.StopPlayback();
            Player.transform.position = new Vector3(Player.transform.position.x, Player.transform.position.y, Player.transform.position.z + 3);
            reset_position.Spyder_position();
        }

        IEnumerator spider_hit()
        {
            yield return new WaitForSeconds(2.0f);
            if (eyes_attack >= eyes.Length)
                Destroy(Spyder_body);
            reset_position.Spyder_position();
        }
    }
}

 

1. OnEnable()

  - 생성 후 기다리는 시간 설정

  - 바라보는 위치 변경(Update  메서드 실행)

  - 기다리는 애니메이션 실행

 

2. Move_timer()

 - 거미 이동 시작(Update 메서드 실행)

 

3. Player와 충돌시

 - 걷기 애니메이션 종료

 - 공격 애니메이션 실행

 - 2초 뒤 Ramdom_position에 있는 위치 변경 메서드 실행

 

4. Bullet과 충돌시

 - 걷기 애니메이션 종료

 - 타격 애니메이션 실행

 - 어택 카운트 증가 및 검정 눈 오브젝트 실행(빨간눈 가림용)

 - 어택카운트가 눈의 오브젝트 개수보다 많아질 경우 거미 오브젝트 삭제

 

 

 

 

public class Select_Spiderweb : MonoBehaviour
{
    [Header("Web Object(Add Collider, Particle)")]
    public GameObject[] webs; 
    public GameObject[] webs_warnning; 
 
    void OnEnable()
    {
        StartCoroutine(selecte());
    }
    void OnDisable()
    {
        foreach (GameObject o in webs) o.SetActive(false);
    }

    IEnumerator selecte()
    {
        int active_wind = Random.Range(0, webs.Length - 5); 
        for (int i = 0; i <= active_wind; i++) // 활성화할 개수만큼 실행
        {
            int play_wind = Random.Range(0, webs.Length);
            
            if (webs[play_wind].activeSelf == false) // 현 상태가 false일 경우
                webs[play_wind].SetActive(true); // true로 변환
            else
                i--; // 현 상태가 true일 경우 반복문 1회 재실행
        }
        yield return new WaitForSeconds(2.0f);
        for (int i = 0; i < webs_warnning.Length; i++) // 활성화할 개수만큼 실행
        {
            if (webs[i].activeSelf == true) // 현 상태가 true일 경우
                webs_warnning[i].SetActive(true); // true로 변환
        }
        foreach (GameObject o in webs) o.SetActive(false); 
        yield return new WaitForSeconds(5.0f); // 5초간 대기
        foreach (GameObject o in webs_warnning) o.SetActive(false);
        StartCoroutine(selecte()); // 자신을 다시 호출
    }
}

활성화할 거미줄을 선택하는 객체

1. 떨어지는 거미줄 실행

2. 일정시간 대기 후 떨어지는 오브젝트 비활성화, 바닥에 위치해 있는 오브젝트 활성화(위치는 매칭되어 있음.)

 

 

public class Spiderweb_move : MonoBehaviour
{
    
    private Rigidbody web_rigidbody;
    public Vector3 destination;
    private float web_speed = 15f;
    bool drop;

    void OnEnable() // 오브젝트 활성화시
    {
        gameObject.transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
        destination = gameObject.transform.position; // 현재의 위치값을 destination에 저장
        drop = true;
    }

    void OnDisable() // 오브젝트 비활성화시
    {
        gameObject.transform.position = destination; // 현재 오브젝트의 위치값을 초기 활성화 시의 위치 값으로 변경
        gameObject.transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
    }
    void Update()
    {
        if(drop)
            gameObject.transform.position = gameObject.transform.position + new Vector3(0, Time.deltaTime*-web_speed, 0); // Y 축으로 이동
    }
}

거미줄을 떨어뜨리기 위한 객체

1. 시작시의 오브젝트 위치값을 저장하고 종료시 저장한 위치값을 현재의 위치값으로 변경

2. 실행 중 오브젝트 Y축으로 떨어뜨리기

 

 

public class Web_debuff : MonoBehaviour
{
    public Spyder_LookRotation spider_move;
    public SmoothLocomotion player_move;
    private void OnTriggerEnter(Collider other)
    {
        if(other.tag != "Untagged" && other.tag != "UI Trigger")
        {
            if (other.tag == "Player")
            {
                spider_move.m_speed = 5f;
                player_move.MovementSpeed = 2.5f;
            }
        }
    }

    private void OnDisable()
    {
        spider_move.m_speed = 2f;
        player_move.MovementSpeed = 5f;
    }
    private void OnTriggerExit(Collider other)
    {
        if (other.tag != "Untagged" && other.tag != "UI Trigger")
        {
            if (other.tag == "Player")
            {
                spider_move.m_speed = 2f;
                player_move.MovementSpeed = 5f;
            }
        }
    }
}

디버프 효과를 주기 위한 객체

1. 해당 객체(바닥 거미줄)과 충돌시 Spider과 Player의 이동 값 변화

2. 충돌에 벗어날시 디버프 전의 이동속도 수치로 돌아옴.

 

 

 

Spider Hunting 실행영상

 

 

'Project > Alice Project' 카테고리의 다른 글

Window Mission  (0) 2022.02.14
Cat Hunting  (0) 2022.02.13
Inventory make  (0) 2022.02.13