본문 바로가기
유니티 개발일지

캐릭터를 향해 달려가는 프리팹 몬스터 스크립트

by 곰스타일 2023. 4. 16.
728x90
반응형
SMALL

일정한 시간 간격으로 랜덤 위치에서 생성되는 프리팹 몬스터 스크립트

 

프리팹 오브젝트 생성된 이후에는 Update 함수에 캐릭터를 향해 달려가는걸로 함수 구현

 

1.우선 메인 캐릭터 함수 선언

GameObject play_char; //캐릭터 위치를 받아오기 위해 캐릭터 오브젝트를 받아옴

Vector3 target_point = Vector3.zero; //오브젝트가 자동으로 이동할 목표 위치 선언

 

2.Awake 함수에서 메인 캐릭터 함수를 찾도록 구현

play_char=GameObject.FindWithTag("MyPlayer");

 

3.Awake 함수에서 메인 캐릭터 함수를 찾도록 구현

메인 캐릭터가 이동함에 따라 메인 캐릭터의 위치가 계속해서 바뀌기 때문에

Update함수에서 메인 캐릭터의 위치를 계속 받아옴

play_char=GameObject.FindWithTag("MyPlayer");

target_point=play_char.transform.position;//오브젝트가 자동으로 이동할 목표 위치를 캐릭터의 위치로 설정

transform.position =Vector3.MoveTowards(transform.position, target_point, Time.deltaTime*3f);

//현재 오브젝트는 타겟 오브젝트를 향해 3f속도로 이동함

 

4.오브젝트가 제자리에서 멈추고 싶다면 아래 함수 적용하면 됨

 transform.position=transform.position;//몬스터 위치는 현재 위치다

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Stage_01_monster_01 : MonoBehaviour
{
    GameObject play_char; //캐릭터 위치를 받아오기 위해 캐릭터 오브젝트를 받아옴
    GameObject gameplay;//사운드를 위해 게임플레이 오브젝트를 받아옴

    //오브젝트가 자동으로 이동할 목표 위치
    Vector3 target_point = Vector3.zero;
    //Vector3 target_point = new Vector3 (-6, 0, 0);
    //GameObject manager;

    //애니메이션 변경을 위한 함수
    Animator animator; //애니메이터 선언
    bool onDie;//죽었는지 여부 bool값
    float time;
   
    void Awake()
    {
        play_char=GameObject.FindWithTag("MyPlayer");
        gameplay=GameObject.FindWithTag("GamePlay");
    }

    void Start()
    {  
        //애니메이션 변경을 위한 함수
        animator=GetComponent<Animator>();
        onDie=false;
        time=0.0f;
   
           
        float x1=Random.Range(10f,11f); // x값은 a와b사이의 랜덤값을 달라
        float y1=Random.Range(-3f,2f); // b값은 a와b사이의 랜덤값을 달라

        transform.position=new Vector3(x1,y1,0); // 오브젝트의 포지션 값을 세팅          
       
        //mainCamera = GetComponent<Camera>();    
        //manager=GameManager.I.gameObject;//게임매니저의 오브젝트를 가져와서 바로 접근하기
    }

    void Update()
    {
        if(onDie==false)//몬스터 살아 있다면
        {
            play_char=GameObject.FindWithTag("MyPlayer");
            //MouseClickDown();
            target_point=play_char.transform.position;
       
            //Vector3.MoveTowards(현재 위치, 목표 위치, 속력) 은 해당 값들을 매개변수로 사용합니다.
            transform.position =Vector3.MoveTowards(transform.position, target_point, Time.deltaTime*3f);
            //transform.position+=Vector3.up*Time.deltaTime; 시간이 흐를수록 y값+ (위로 올라감)
        }

        if(onDie==true)//몬스터 죽었다면
        {
            time+=Time.deltaTime;//시간재기
            transform.position=transform.position;//몬스터 위치는 현재 위치다
        }
        if(time>0.5f)
        {
            DestroyMe();//0.5초 지나면 몬스터 오브젝트 파괴
        }

        if (Time.timeScale==0)//타임스케일 0일때
        {
            Destroy(gameObject);//캐릭터vs몬스터가 충돌해서 타임스케일이 0이 됬다면 몬스터 오브젝트를 파괴한다
        }
    }

    //캐릭터vs몬스터 충돌시
    void OnTriggerEnter2D(Collider2D other) //두 콜라이더가 출동 시 나와 부딪힌 물체를 other에 담음
    {
        if (other.tag=="MyPlayer") // 충돌한 물체의 태그가 MyPlayer라면
        {
            print("몬스터vs캐릭터 충돌");
            //Destroy(other.gameObject); // 충돌된 오브젝트를 파괴한다
            Time.timeScale=0.0f; // 몬스터와 캐릭터 충돌시 시간정지
        }

        if (other.tag=="Gunr") // 충돌한 물체의 태그가 Gunr이라면
        {
            animator.SetInteger("State",1);
            OnDie();
            GetComponent<CapsuleCollider2D>().enabled =  false;  //콜라이더 끄기
            //Destroy(gameObject); // 나 자신 오브젝트를 파괴한다
        }
    }

    //애니메이션 변경을 위한 함수(캐릭터 죽었을 시 onDie값 true로 전환)
    private void OnDie()
    {
        onDie=true;
        //GamePlay 오브젝트의 스크립트에서 public 함수 호출(파괴 사운드 skill 호출)
        gameplay.GetComponent<GamePlay>().play_sound_skill();
        gameplay.GetComponent<GamePlay>().GetScore_1(); // + 스코어1점 함수 호출
    }

    private void DestroyMe()//나자신 파괴하는 함수
    {
        Destroy(gameObject); // 나 자신 오브젝트를 파괴한다        
    }
   

       
}
728x90
반응형
LIST

댓글