EasyCastleUNITY

2023/08/31 개인필기 (Occulusion Culling,Input System) 본문

개인 필기

2023/08/31 개인필기 (Occulusion Culling,Input System)

EasyCastleT 2023. 8. 31. 12:56

책을 통해 공부할 거면, 따라 치는것이 아닌, 코드를 쪼개서, 어느 순서로 작성되었는지를 파악하고 작성해라

모르는 것이 나오면, 공식문서를 찾아보는 연습을 해라 

 

Occulusion Culling

카메라 시야에서 다른 물체에 가려 보이지 않는 물체를 렌더링 하지 않는 기법 

 

가리는 물체의 Occluder Static, 가려지는 물체의 Occludee Static을 설정해야 한다. 

Occluder Static,Occludee Static

Occluder 뒤에있는 Occludee 는 렌더링 되지 않는다. [Window] ->[Rendering] ->[Occulusion Culling] 에서 설정한다. 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

Input System

https://docs.unity3d.com/Packages/com.unity.inputsystem@1.7/manual/index.html

 

Input System | Input System | 1.7.0

Input System The Input System allows your users to control your game or app using a device, touch, or gestures. Introduction Unity supports input through two separate systems, one older, and one newer. The older system, which is built-in to the editor, is

docs.unity3d.com

Input Actions 에섯을 생성해 각종 입력값을 정의하고 할당한다. 

패키지 매니저에서 설치

설치후, [Edit] -> [Project Settings] 에서 Player 섹션의  Other Settings에 Active Input Handling 속성 여부 확인 

새로운 속성 생성됨

Asset -> Create -> Input Actions

영역 3개: Action Maps, Actions, Action Properties
Control Scheme
예시
작성해본 Input Actions (Binding 작업)

만든 Action과 오브젝트 연결

연결할 오브젝트의 Player Input 컴포넌트를 부착하고 assign 한다. 

Behavior 속성 4개

Send Messages : Player Input 컴포넌트가 있는 게임오브젝트에 SendMessage 함수를 이용해 호출

Broadcast Messages: Send Message와 동일하지만 BroadcastMessage 함수를 이용해

                                   하위에 있는 게임오브젝트의 함수도 호출

Invoke Unity Events: 액션별로 이벤트 연결 인터페이스가 생성되고 각각 호출하려는 함수를 연결해 사용한다.

Invoke C Sharp Events: c# 스크립트에서 이벤트를 직접 연결해서 사용한다. 

Send Messages 사용
Send Messages 실행결과

Invoke Unity Event 활용

Behavior Invoke Unity Events로 변경

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class WarriorController : MonoBehaviour
{
    private Animator anim;
    private new Transform transform;
    private Vector3 moveDir;

    private void Start()
    {
        this.anim = this.GetComponent<Animator>();
        this.transform = this.GetComponent<Transform>();
    }

    private void Update()
    {
        if(this.moveDir != Vector3.zero)
        {
            this.transform.rotation = Quaternion.LookRotation(this.moveDir);
            this.transform.Translate(Vector3.forward * Time.deltaTime * 4.0f);
        }
    }

    #region SEND_MESSAGE
    void OnMove(InputValue value)
    {
        Vector2 dir = value.Get<Vector2>();
        this.moveDir = new Vector3(dir.x, 0, dir.y);

        this.anim.SetFloat("Movement", dir.magnitude);
        Debug.LogFormat("dir :{0}", dir);
    }

    void OnAttack()
    {
        Debug.Log("Attack");
        this.anim.SetTrigger("Attack");
    }
    #endregion
    #region UNITY_EVENTS
    public void OnMove(InputAction.CallbackContext context)
    {
        Debug.LogFormat("context.phase:{0}", context.phase);

        Vector2 dir = context.ReadValue<Vector2>();

        this.moveDir = new Vector3(dir.x,0,dir.y);

        this.anim.SetFloat("Movement", dir.magnitude);
    }

    public void OnAttack(InputAction.CallbackContext context)
    {
        Debug.LogFormat("context.phase:{0}", context.phase);

        if (context.performed)
        {
            Debug.Log("Attack");
            this.anim.SetTrigger("Attack");
        }
    }
    #endregion
}

assign

region 사용

Invoke C Sharp Events 활용

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class WarriorController : MonoBehaviour
{
    private Animator anim;
    private new Transform transform;
    private Vector3 moveDir;

    private PlayerInput playerInput;
    private InputActionMap mainActionMap;
    private InputAction moveAction;
    private InputAction attackAction;

    private void Start()
    {
        this.anim = this.GetComponent<Animator>();
        this.transform = this.GetComponent<Transform>();

        this.playerInput = this.GetComponent<PlayerInput>();
        //Action map 추출 
        this.mainActionMap = playerInput.actions.FindActionMap("PlayerActions");

        //Move, Attack 액션 추출
        this.moveAction = this.mainActionMap.FindAction("Move");
        this.attackAction = this.mainActionMap.FindAction("Attack");

        //액션에 이벤트 등록

        //이동
        this.moveAction.performed += (context) => {
            Vector2 dir = context.ReadValue<Vector2>();
            this.moveDir = new Vector3(dir.x,0,dir.y);
            this.anim.SetFloat("Movement", dir.magnitude);
        };
        //이동을 멈추면
        this.moveAction.canceled += (context) => {
            this.moveDir = Vector3.zero;
            this.anim.SetFloat("Movement", 0.0f);
        };
        //공격
        this.attackAction.performed += (context) => {
            Debug.Log("Attack by c# event");
            this.anim.SetTrigger("Attack");
        };

    }

    private void Update()
    {
        if(this.moveDir != Vector3.zero)
        {
            this.transform.rotation = Quaternion.LookRotation(this.moveDir);
            this.transform.Translate(Vector3.forward * Time.deltaTime * 4.0f);
        }
    }

    #region SEND_MESSAGE
    void OnMove(InputValue value)
    {
        Vector2 dir = value.Get<Vector2>();
        this.moveDir = new Vector3(dir.x, 0, dir.y);

        this.anim.SetFloat("Movement", dir.magnitude);
        Debug.LogFormat("dir :{0}", dir);
    }

    void OnAttack()
    {
        Debug.Log("Attack");
        this.anim.SetTrigger("Attack");
    }
    #endregion
    #region UNITY_EVENTS
    public void OnMove(InputAction.CallbackContext context)
    {
        Debug.LogFormat("context.phase:{0}", context.phase);

        Vector2 dir = context.ReadValue<Vector2>();

        this.moveDir = new Vector3(dir.x,0,dir.y);

        this.anim.SetFloat("Movement", dir.magnitude);
    }

    public void OnAttack(InputAction.CallbackContext context)
    {
        Debug.LogFormat("context.phase:{0}", context.phase);

        if (context.performed)
        {
            Debug.Log("Attack");
            this.anim.SetTrigger("Attack");
        }
    }
    #endregion
}

Direct Binding - binding 한 정보를 받아오는 것이 아닌 직접 코드로 바인딩하여 사용

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class WarriorDirectController : MonoBehaviour
{
    private InputAction moveAction;
    private InputAction attackAction;

    private Animator anim;
    private Vector3 moveDir;
    // Start is called before the first frame update
    void Start()
    {
        this.anim = GetComponent<Animator>();
        //1.액션 만들기
        this.moveAction = new InputAction("Move", InputActionType.Value);
        this.attackAction = new InputAction("Attack", InputActionType.Button);

        //2.바인딩
        //move action binding
        this.moveAction.AddCompositeBinding("2DVector")
        .With("Up", "<Keyboard>/w")
        .With("Down", "<Keyboard>/s")
        .With("Left", "<Keyboard>/a")
        .With("Right", "<Keyboard>/d");
        //attack action binding
        this.attackAction.AddBinding("<Keyboard>/space");

        //3.이벤트 붙이기 
        this.moveAction.performed += (context) => {
            Vector2 dir = context.ReadValue<Vector2>();
            this.moveDir = new Vector3(dir.x, 0, dir.y);
            this.anim.SetFloat("Movement", dir.magnitude);
        };

        this.moveAction.canceled += (context) => {
            this.moveDir = Vector3.zero;
            this.anim.SetFloat("Movement", 0.0f);
        };

        this.attackAction.performed += (context) => {
            this.anim.SetTrigger("Attack");
        };
        //4. 활성화
        this.moveAction.Enable();
        this.attackAction.Enable();
    }

    // Update is called once per frame
    void Update()
    {
        if(this.moveDir != Vector3.zero)
        {
            //회전
            transform.rotation = Quaternion.LookRotation(this.moveDir);
            //회전한 후 전진 방향으로 이동
            transform.Translate(Vector3.forward * Time.deltaTime * 4.0f);
        }
    }
}

Warrior Inspector
Direct Binding 실행 결과

 

'개인 필기' 카테고리의 다른 글

Photon Fusion 세팅  (0) 2023.11.15
유니티 쉐이더  (0) 2023.08.31
2023/08/30 필기 (Light 관련 및 씬 비동기 전환)  (0) 2023.08.30
2023/08/29 필기  (0) 2023.08.29
2023/08/28 필기 (오브젝트 풀링 내용 포함)  (0) 2023.08.28