[TIL] 43 반별강의(AI,NAV), 심화주차 ⭐⭐

업데이트:

카테고리:

태그: , ,


NavMesh



유니티 심화주차 3일 , 개인공부

   [o] 알고리즘 문제 - 48
   [o] 다른반 강의 듣기
   [x] ui 2회차 듣기
   [x] 심화주차 강의 듣기.







반별강의

꿀팁

Simulator gameView 에서 simulator 로 변경하면 폰화면 미리보기 가능.
image

Window -> Analysis -> Profiler (ctrl+7) : 프레임,cpu, gpu, 메모리 등 사용량을 체크할 수 있다.
image
그래픽 관련 최적화 Frame Debugger

인스펙터창 2개로 편하게 값 옮기기
image

Context Menu : 테스트용도로 특정함수 수동으로 호출할 때
에셋 사용할 때 샘플을 보고 사용하자.

AI

StateMachine

StateMachine StateMachineBehaviour 유니티에서는 StateMachine을 직접 구현할 수도 있고, 유니티에서 애니메이터에 확장하여 사용할 수 있는 StateMachineBehaviour를 제공합니다.

StateMachine.cs
using UnityEngine;

public class AttackBehaviour : StateMachineBehaviour
{
	public GameObject particle;
	public float radius;
	public float power;
	
	protected GameObject clone;
	
	override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
	{
        Debug.Log("OnStateEnter ");
		clone = Instantiate(particle, animator.rootPosition, Quaternion.identity) as GameObject;
		Rigidbody rb = clone.GetComponent<Rigidbody>();
		rb.AddExplosionForce(power, animator.rootPosition, radius, 3.0f);
	}
	override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
	{
        Debug.Log("OnStateExit ");
		Destroy(clone);
	}
	override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
	{
		Debug.Log("On Attack Update ");
	}
	override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
	{
		Debug.Log("On Attack Move ");
	}
	override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
	{
		Debug.Log("On Attack IK ");
	}
}
  • OnStateEnter 애니메이션 실행 시
  • OnStateExit 애니메이션 종료 시
  • OnStateUpdate 매 프레임마다 실행
  • OnAnimatorMove: 업데이트 프레임마다 루트 모션을 수정할 수 있도록 각 Animator 컴포넌트에 대해 한 번 호출됩니다.
  • OnAnimatorIK: 애니메이션 IK를 설정합니다. IK pass가 활성화된 각 애니메이터 컨트롤러 레이어에 대해 한 번 호출됩니다.





behaviour tree

  • 루트(root) 노드 CS에서의 트리의 뿌리는 항상 제일 아래에 있지 않고 제일 위에 있습니다.
  • 흐름 제어 노드 (flow-control node)
  • Sequence node : AND 역할을 하는 노드 (탐색하는 노드 모든노드를 본다, 중간에 실패하면 종료)
  • Selector node : OR 역할을 하는 (왼쪽 부터 하나라도 체크하면 리턴)
  • 리프(leaf) 노드 : 실제 행동이 들어가 있는 노드

image

node
public enum NodeState
{
    Running,
    Failure,
    Success
}

public abstract class Node
{
    protected NodeState state;
    public Node parentNode;
    protected List<Node> childrenNode = new List<Node>();

    public Node()
    {
        parentNode = null;
    }

    public Node(List<Node> children)
    {
        foreach(var child in children)
        {
            AttatchChild(child);
        }
    }

    public void AttatchChild(Node child)
    {
        childrenNode.Add(child);
        child.parentNode = this;
    }

    public abstract NodeState Evaluate();
}

public class SequenceNode : Node
{
    public SequenceNode() : base() {}

    public SequenceNode(List<Node> children) : base(children) {}

    public override NodeState Evaluate()
    {
        bool bNowRunning = false;
        foreach (Node node in childrenNode)
        {
            switch (node.Evaluate())
            {
                case NodeState.Failure:
                    return state = NodeState.Failure;
                case NodeState.Success:
                    continue;
                case NodeState.Running:
                    bNowRunning = true;
                    continue;
                default:
                    continue;
            }
        }

        return state = bNowRunning ? NodeState.Running : NodeState.Success;
    }
}

public class SelectorNode : Node
{
    public SelectorNode() : base(){}

    public SelectorNode(List<Node> children) : base(children){}

    public override NodeState Evaluate()
    {
        foreach(Node node in childrenNode)
        {
            switch(node.Evaluate())
            {
                case NodeState.Failure:
                    continue;
                case NodeState.Success:
                    return state = NodeState.Success;
                case NodeState.Running:
                    return state = NodeState.Running;
                default:
                    continue;
            }
        }

        return state = NodeState.Failure;
    }
}







구역간에 가중치를 설정하여 더 빠른 길을 선택해서 길찾기를 해준다.

NavMesh Surface
최신 navmesh :surface
agent type : 각각 agent 의 특징을 정할 수 있다.

동적 베이킹 object collection : volume 일정 거리안에서 baking 을해 좀 더 효율적으로, 최적화하여 돌릴 수 있다.
다음에 surface 다시 정리하기

잡담,정리

Simulator gameView 에서 simulator 로 변경하면 폰화면 미리보기 가능.
Window -> Analysis -> Profiler : 프레임,cpu, gpu, 메모리 등 사용량을 체크할 수 있다.





참고 : 유니티 TOP


📔

댓글남기기