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
'유니티 개발일지' 카테고리의 다른 글
유니티(Unity) 설치 방법 (0) | 2023.04.24 |
---|---|
유니티 시간 정지 상태에서 애니메이션 동작 구현 및 일시정지 (0) | 2023.04.17 |
유니티 Vector3 값 모음 (0) | 2023.04.16 |
유니티 조이스틱 구현 (0) | 2023.04.14 |
몬스터 프리팹 함수를 호출하는 InvokeRepeating 프리팹 복제 Instantiate (0) | 2023.04.14 |
댓글