Resources/PhotonNetwork 폴더 하위에 있는 AngryBotResources 패키지를 임포트한다.
스테이지 설치와 라이트 매핑
AngryBotResources/Prefabs 폴더에 있는 Environment 프리팹을 하이라키 뷰로 드래그해 배치한다.
라이트 매핑을 위해 메뉴에서 [Window]-[Rendering]-[Lighting]을 선택해 라이팅 뷰를 연다. [Scene]탭을 선택하고 [New Lighting Settings] 버튼을 클릭해 SampleScene의 라이트 매핑 정보를 저장할 에셋을 생성한다. 생성된 라이팅에셋은 Scenes폴더로 이동시킨다.
라이팅 세팅 에셋을 생성하면 라이팅뷰의 Lighting Setting 옵션이 활성화된다. 좀더 빠른 라이팅 매핑을 위해 Lightmap Resolution 속성을 기본값이 40에서 10 또는 20 정도로 설정한다.
라이팅뷰 아래에 있는 [Generate Lighting] 버튼을 클릭해 라이트 맵 베이킹을 시작한다.
다음 화면은 베이킹후 라이트매핑이 완료된 화면이며 비네팅 효과로 모서리 부분이 어둡게 표현되었다.(약하게 하였다)
Bloom, Tonemapping 효과
Global Volume의 인스펙터뷰에서 [Add override] 버튼을 클릭해 Tonemapping을 추가한후 Mode Option을 체크후 ACES를 선택한다. 조명의 밝기를 HDR에서 사람이 인식할 수 있는 범위로 조정하는 효과를 말한다.
하이라키뷰의 Direct Light를 선택후 인스펙터뷰에서 [Light]-[Emission]-[Intensity]를 1에서2로 변경해서 밝게한다
다시 [Add override] 버튼을 클릭해 Bloom효과를 추가하고 Intensity를 1.5로 설정한다. 광원주위를 과장되게 표현하는 효과이다.
Input System은 PlayerInput 컴포넌트를 사용하는 방법과 PlayerInput컴포넌트 없이 직접 InputAction을 생성하고 액션을 정의하는 방식이 있다. 새로운 스크립트를 만들고 PlayerCtrlByEvent로 이름변경한다.
UnityEngine.InputSystem 네임스페이스를 명시하고 이동과 공격 액션을 저장할 변수를 선언한다.
private InputAction moveAction; //액션 저장용 변수
private InputAction attackAction; //액션 저장용 변수
InputAction창에서 정의했던 액션을 InputAction()함수를 사용해 정의한다. moveAction은 WASD및 방향키등 여러가지 binding을 구현해야 하므로 moveAction.AddCompositeBinding()를 이용해 binding해야한다. ".With()" 메소드를 사용해 추가할 수 있다. 여기서는 방향키는 추가하지 않았다. 바인딩타입이 2DVector이므로 "2DVector"를 parameter로 사용하였다.
moveAction = new InputAction("Move", InputActionType.Value);
//Move 액션의 복합 바인딩 정보 정의
moveAction.AddCompositeBinding("2DVector")
.With("Up", "<Keyboard>/w")
.With("Down", "<Keyboard>/s")
.With("Left", "<Keyboard>/a")
.With("Right", "<Keyboard>/d");
attackAction = new InputAction("Attack",
InputActionType.Button,
"<Keyboard>/space");
액션의 preformed,cancled 이벤트에 람다식을 연결하는 방식은 이전과 같습니다. action의 활성화를 해주어야 합니다.
moveAction.Enable();
attackAction.Enable();
PlayerCtrlByEvent 전체 코드입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerCtrlByEvent : MonoBehaviour {
private InputAction moveAction;
private InputAction attackAction;
private Animator anim;
private Vector3 moveDir;
// Start is called before the first frame update
void Start() {
anim = GetComponent<Animator>();
//Move 액션 생성 및 타입 설정
moveAction = new InputAction("Move", InputActionType.Value);
//Move 액션의 복합 바인딩 정보 정의
moveAction.AddCompositeBinding("2DVector")
.With("Up", "<Keyboard>/w")
.With("Down", "<Keyboard>/s")
.With("Left", "<Keyboard>/a")
.With("Right", "<Keyboard>/d");
//Move 액션의 performed, canceled 이벤트 연결
moveAction.performed += ctx => {
Vector2 dir = ctx.ReadValue<Vector2>();
moveDir = new Vector3(dir.x, 0, dir.y);
//Warrior_Run 애니메이션 실행
anim.SetFloat("Movement", dir.magnitude);
};
moveAction.canceled += ctx => {
moveDir = Vector3.zero;
anim.SetFloat("Movement", 0.0f);
};
//Move 액션의 활성화
moveAction.Enable();
//Attack 액션 생성
attackAction = new InputAction("Attack",
InputActionType.Button,
"<Keyboard>/space");
//Attack 액션의 performed 이벤트 연결
attackAction.performed += ctx => {
anim.SetTrigger("Attack");
};
//Attack 액션의 활성화
attackAction.Enable();
}
// Update is called once per frame
void Update() {
if (moveDir != Vector3.zero) {
//진행 방향으로 회전
transform.rotation = Quaternion.LookRotation(moveDir);
//회전한 후 전진방향으로 이동
transform.Translate(Vector3.forward * Time.deltaTime * 4.0f);
}
}
}
하이라키뷰에 warrior모델을 하나 더 끌어다 놓고 Animator컴포넌트에 AnimationController_Warrior컨트롤러를 연결하고 PlayerCtrlByEvent 스크립트도 연결한다.
2개의 warrior가 Input System의 구현은 다르지만 동일하게 동작하는 걸 확인할 수 있다.