반응형
1. 프로젝트에 navigation 추가해주기
2. navigation 을 이용해서 따라가는 NPC 제작
NavMesh Agent 스크립트 부착 및 아래 관련 코드 작성 (Zombie.ts)
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import * as UnityEngine from 'UnityEngine'
import { NavMeshAgent } from 'UnityEngine.AI';
import { ZepetoPlayers } from 'ZEPETO.Character.Controller';
import ClientStarter from './ClientStarter';
import { Text } from 'UnityEngine.UI';
export default class Zombie extends ZepetoScriptBehaviour {
@Header("Hp Managerment")
public hp : number = 10;
private hpText : Text;
private isDead : boolean = false;
@Header("Nav Managerment")
private targetPlayer : UnityEngine.GameObject;
private pathFinder : NavMeshAgent;
private hasTarget : boolean = false;
private whatIsTarget : UnityEngine.LayerMask;
private isHost : boolean = false;
public index : number = 0;
Start() {
this.pathFinder = this.GetComponent<NavMeshAgent>();
this.hpText = this.GetComponentInChildren<Text>();
this.hpText.text = this.hp.toString();
}
Update(){
this.isHost = UnityEngine.GameObject.Find("ClientStarter").GetComponent<ClientStarter>().player.isHost;
if(this.isHost && this.isDead == false){
if(UnityEngine.GameObject.FindWithTag("Player") != null && this.hasTarget == false){
let checkDistance : number = 100;
let colliders : UnityEngine.Collider[] = UnityEngine.Physics.OverlapSphere(this.transform.position, 20);
for(let i = 0; i < colliders.length; i++){
if(colliders[i].gameObject.tag == "Player"){
//console.log(`${colliders[i].gameObject.name}`);
let currentDistance = UnityEngine.Vector3.Distance(colliders[i].gameObject.transform.position, this.transform.position);
if(currentDistance < checkDistance){
//console.log(`${colliders[i].gameObject.name} 's distance : ${currentDistance}`);
this.targetPlayer = colliders[i].gameObject;
this.hasTarget = true;
checkDistance = currentDistance;
}
}
}
}
if(this.hasTarget){
this.pathFinder.SetDestination(this.targetPlayer.transform.position);
}
if(this.hasTarget == true && UnityEngine.Vector3.Distance(this.targetPlayer.transform.position, this.transform.position) > 6){
this.hasTarget = false;
}
}
}
MinusHp(){
let hpnum = this.hp - 2;
console.log(` ${this.index} zombie : ${hpnum}`);
UnityEngine.GameObject.Find("ClientStarter").GetComponent<ClientStarter>().ChangeZombieHP(this.index , hpnum);
}
SetHp(hpnum : number){
console.log(`SetHp ${hpnum}`);
this.hp = hpnum;
this.hpText.text = this.hp.toString();
if(this.hp <= 0) this.isDead = true;
}
}
위 코드는 제페토 콘텐츠를 만들기 위해 타입스크립트로 작성되었으며 실제 유니티 상에 동작하는 cs 경우 다른 코드를 참고하시는 게 좋습니다.
3. 지나갈 수 없는 물체 및 장애물 만들기
Nav Mesh Obstacle 스크립트 붙이기 이후에 Map Bake 하면 자동으로 지나갈 수 없는 길 처리가 됨
위는 장애물 처리 결과 이미지
반응형
'IT' 카테고리의 다른 글
[Unity/Zepeto] 싱글톤 만들기 (0) | 2023.07.14 |
---|---|
[Zepeto/Unity] 개발하면서 알아두면 좋은 팁! TIP (0) | 2023.07.14 |
[Unity/Zepeto] 개발하면서 해결한 오류 및 정리 (0) | 2023.06.09 |
[Unity/Zepeto] 제페토 멀티 플레이어 환경 세팅 요약 정리 (0) | 2023.06.07 |
[Unity] 유니티 Scroll view (스크롤뷰) 스크롤 안될 때 / 안 내려갈 때 / 스크롤바가 안 생길 때 (0) | 2023.06.05 |
댓글