2025유니티수업

0630 깃허브 데스크톱(Branch), 유니티(적 인공지능(AI))

버스창문 2025. 6. 30. 19:05

Branch(브랜치) : 프로젝트 소스코드나 파일을 변경하거나 또는 기능을 추가할 때 작업하는 개별 공간

 

 

 

 

New Branch

 

 

 

 

 

 

 

 

 

Leave선택, 변경된 내용을 branch에 내버려두고 다른 branch로 변경함

변경된 내용이 사라짐

 

 

 

 

 

 

 

restore

 

다시 생김

 

 

 

새로 하나 만들려하면 분기가 뜸

어디를 기반으로 branch를 만들건가

 

 

Bring선택

 

 

 

 

 

__________________________________________________________________

 

시야에 플레이어가 들어와야 추적하는 적 ai만들기

    public float viewRadius = 15f; //적 캐릭터 시야 사정거리
    [Range(0, 360)]
    public float viewAngle = 120f; //적 캐릭터 시야각 범위
    void Start()
    {
        
    }
    public Vector3 CirclePoint(float angle)
    {
        angle += this.transform.eulerAngles.y; // 로컬 좌표계 기준으로 설정 하기 위해 적 캐릭터의 y축 회전값을 더함


        //원형의 좌표를 구하는 공식 : Mathf.Deg2Rad = PI * 2 / 360
        return new Vector3(Mathf.Sin(angle * Mathf.Deg2Rad), 0, Mathf.Cos(angle * Mathf.Deg2Rad));
        //일반 각도를 라디안 각도로 변환
    }

 

 

유니티 Editor

유니티 IDE(프로그램을 만드는 프로그램)를 구성하는 API집합이면, 런타임시에 다른 스크립트에서 참조 할 수 없다.

디자인 시점에서만 사용할 수 있는 클래스로써 Window 또는 인스펙터의 UI를 자유롭게 구성하거나 확장할 수 있다.

즉 씬 화면에서만 보인다.

 

 

 

public class FOVEditor : Editor
{
    private void OnSceneGUI()
    {
        SwatFov fov = (SwatFov)target; //FoV 스크립트의 인스턴스를 가져온다

        Vector3 fromAnglePos = fov.CirclePoint(-fov.viewAngle * 0.5f); //원주 위의 시작점의 좌표를 계산 (주어진 각도의 절반만큼씩 좌우로
                                                                       //시작점과 끝점을 맞춤) 시작점만 맞추면 각도를 전달하기 때문에
                                                                       //끝점은 안만들어도 됨 



        Handles.color = Color.white; //시야각을 표현하기 위한 핸들의 색깔

        Handles.DrawSolidArc( //반지름 그리는 함수
            fov.transform.position, //원의 중심 좌표
            Vector3.up, //회전 기준 축(y축)
            fromAnglePos, // 부채꼴의 시작점 좌표
            fov.viewAngle, //시야각 부채꼴의 각도
            fov.viewRange //부채꼴의 반지름
        );

        Handles.Label( // 씬 화면에 라벨을 추가해서 텍스트로 표시하게 해주는 함수
            fov.transform.position + Vector3.up * 2f, // 라벨 위치
            "Fov Range : " + fov.viewRange + "\n" + "Fov Angle : " + fov.viewAngle //적을 글
            );


    }
}

 

Editor폴더가 예약어라서 알아서 적용된다

 

 

 

결과물

    IEnumerator CheckState()
    {

        yield return new WaitForSeconds(1); // 1초 대기
                                            // 오브젝트 풀에 생성 시, 다른 스크립트에서 초기화를 위해 대기
        while (!isDie)
        {
            //Debug.Log(this.state);
            if (state == eState.Die) yield break;

            float dist = Vector3.Distance(this.transform.position, playerTr.position);
            if (dist <= attackDist)
            {
                if (fov.isViewPlayer())
                    this.state = eState.Attack; // 사이에 장애물 없으면 공격
                else
                    this.state = eState.Trace; // 아니면 마저 추적
            }
            else if (this.fov.isTracePlayer())
            {
                this.state = eState.Trace;
            }
            else
            {
                this.state = eState.Patrol;
            }

            yield return ws;
        }

    }
    
    
    기존에 거리에 따라서만 하던걸 변경

 

 

________________________________________________________

장애물 피하는 카메라

저거 누르면 컴포넌트가 하나 붙음

Avoid Obstacle : 위에 장애물로 정해둔 Collider를 피함

그 아래는 피하는 방식

 

______________________________________________

 

지정된 장소에서만 점프하는 off mesh

Start : 점프할곳

End : 점프해서 도착할 곳

Cost : 저거 점프하는거에 할당할 비용(agent는 a* 알고리즘 기반이라 비용이 낮은쪽으로 가려함)

Bidirectional : 양방향으로 이동