본문 바로가기
IT

[Unity/Zepeto] Navigation 사용법 / 플레이어 따라가는 npc 만들기 / 장애물 만들기

by 배애앰이 좋아 2023. 6. 13.
반응형

 

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 하면 자동으로 지나갈 수 없는 길 처리가 됨

 

 

위는 장애물 처리 결과 이미지

 

반응형

댓글