일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 모작
- OVR
- 유니티 GUI
- meta
- CGV
- 오브젝트 풀링
- input system
- 가상현실
- 앱 배포
- 유니티
- Oculus
- 멀티플레이
- 팀 프로젝트
- VR
- 유니티 UI
- XR
- 드래곤 플라이트 모작
- 오큘러스
- 유니티 Json 데이터 연동
- 길건너 친구들
- 개발
- Photon Fusion
- HAPTIC
- 개발일지
- meta xr
- 팀프로젝트
- 드래곤 플라이트
- 포트폴리오
- 연습
- ChatGPT
- Today
- Total
EasyCastleUNITY
2023/08/31 개인필기 (Occulusion Culling,Input System) 본문
책을 통해 공부할 거면, 따라 치는것이 아닌, 코드를 쪼개서, 어느 순서로 작성되었는지를 파악하고 작성해라
모르는 것이 나오면, 공식문서를 찾아보는 연습을 해라
Occulusion Culling
카메라 시야에서 다른 물체에 가려 보이지 않는 물체를 렌더링 하지 않는 기법
가리는 물체의 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 Actions 에섯을 생성해 각종 입력값을 정의하고 할당한다.
설치후, [Edit] -> [Project Settings] 에서 Player 섹션의 Other Settings에 Active Input Handling 속성 여부 확인
Asset -> Create -> Input Actions
만든 Action과 오브젝트 연결
연결할 오브젝트의 Player Input 컴포넌트를 부착하고 assign 한다.
Send Messages : Player Input 컴포넌트가 있는 게임오브젝트에 SendMessage 함수를 이용해 호출
Broadcast Messages: Send Message와 동일하지만 BroadcastMessage 함수를 이용해
하위에 있는 게임오브젝트의 함수도 호출
Invoke Unity Events: 액션별로 이벤트 연결 인터페이스가 생성되고 각각 호출하려는 함수를 연결해 사용한다.
Invoke C Sharp Events: c# 스크립트에서 이벤트를 직접 연결해서 사용한다.
Invoke Unity Event 활용
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
}
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);
}
}
}
'개인 필기' 카테고리의 다른 글
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 |