Design/Unity & Oculus

Unity Quest for Mac(Silicon) - full

romeoh 2024. 1. 14. 19:18
반응형

Blender, Unity 목록

 

  1.  
  1. Project 생성
  2. Asset 추가
  3. URP(Universal Render Pipeline) 변환
  4. 객체 생성
  5. XR Origin
  6. Oculus에서 실행
  7. VR Hand 적용하기
  8. 핸드 애니메이션
  9. 스크립트 작성 
  10. 오른쪽 컨트롤러 복제하기
  11. Locomotion System
  12. Character Controller
  13. 장면 꾸미기
  14. 물건잡기
  15. 총알 발사
  16. 타겟 만들기
  17. 타겟 스크립트
  18. 문 열기
  19. 타켓 더미 에니메이션
  20. 타켓 더미 에니메이션 스크립트
  21. 광선 만들기
  22. UI 만들기
  23. UI 스크립트

 

 

 

 

1. Project 생성

2022.3.16f에서 3D (URP) 프로젝트를 생성합니다.

 

 

Package Manager에서 XR Plugin Management를 설치합니다.

 

 

 

XR Interaction Toolkit도 설치하고 재구동합니다.

 

 

 

Project Settings > XR Plug-in Management 에서 OpenXR을 체크합니다.

 

 

 

OpenXR에서 +를 눌러서 프로파일을 추가합니다.

 

 

Fix를 눌러서 문제를 해결합니다.

 

 

 

 

2. Asset 추가

https://assetstore.unity.com/packages/3d/props/polygon-starter-pack-low-poly-3d-art-by-synty-156819

위 사이트에서 에셋을 추가합니다.

 

 

Package Manager에서 다운로드 합니다.

 

 

Import 합니다.

 

 

 

 

 

 

3. URP(Universal Render Pipeline)로 변환

Prefabs에서 아무거나 Scene에 추가합니다.

내장 Renderer를 사용하기 때문에 Rendering되지 않습니다.

 

 

 

 

Window > Rendering > Render Pipeline Converter를 선택합니다.

 

 

 

모두 체크하고 Converter초기화 합니다.

 

 

 

Asset을 Universal Pipeline으로 변환합니다.

 

 

 

 

URP로 변환되었습니다.

 

 

 

 

 

 

4. 객체 생성

 

객체를 삭제하고 

SM_PolygonPrototype_Buildings_Floor_5x5_01P를 Scene에 추가하고 Transform을 Reset 합니다.

 

 

 

 

크기와 위치를 적당히 조절합니다.

 

SM_SimpleSky_Dome_01 을 Scene에 추가하고 Reset Transform 합니다.

 

 

 

SM_Generic_CloudRing_01을 Scene에 추가하고 Reset Transform 합니다.

 

 

 

SkyDome 사이즈를 조절합니다.

 

Create Empty 로 GameObject를 추가하고 Reset Transform합니다.

 

GameObject를 Enviroment로 이름을 변경하고 생성한 객체를 집어 넣습니다.

 

 

 

 

 

5. XR Origin

XR > XR Origin (VR)을 추가합니다.

 

 

 

XR Origin > Tracking Origin Modef를 Floor로 변경합니다.

 

 

XR Origin에 Main Camera 가 있기 때문에 Scene의 Main Camera는 삭제합니다.

 

 

Left / Right Controller도 삭제합니다.

 

 

Camera Offset 안에 Create Empty 를 생성하고 Reset Transform 합니다.

이름을 LeftHandController로 변경합니다.

 

 

복제해서 RightHandController도 생성합니다.

 

 

 

두개다 선택하고 Add Component에서 XR Controller (Action-Base)를 추가합니다.

 

 

 

 

Package Manager에서 Starter Assets를 Import 합니다.

 

 

 

 

LeftHandController에서 XRI Default Left Controller를 선택합니다.

 

 

 

RightHandController도 선택해줍니다.

 

 

XR Origin에서 Input Action Manager에 Element를 추가합니다.

 

 

XRI Default Input Action을 선택합니다.

 

 

 

XR Origin 을 Reset Transform 합니다.

 

 

 

 

6. Oculus에서 실행

Project Setting에서 Oculus를 체크합니다.

 

 

 

 

File > Build Settings 에서 Oculus로 Switch Platform 하고 Build And Run 합니다.

 

 

Oculs에서 확인 할 수 있습니다.

 

 

 

 

 

7. VR Hand 적용하기

VR_Hands.unitypackage
0.40MB

 

VR Hand를 다운로드합니다.

 

 

다운로드한 Package를 Assets에 Drag and Drop 해서 Import 합니다.

 

 

 

 

LeftHandController의 Model Prefab에 LeftHandPrefab을 넣어줍니다.

 

 

RightHandPrefab도 적용합니다.

 

 

VR Hand가 적용되었습니다.

 

 

 

 

8. 핸드 애니메이션

VR_Hands 폴더에 Animator Controller를 추가합니다.

 

 

 

이름을 LeftHandAnimationController 로 변경합니다.

 

 

 

LeftHandPrefab에 Add Component에서 Animator를 추가합니다.

 

 

 

Avatar를 l_hand_skeletal_lowersAvatar를 지정합니다.

 

 

LeftHandAnimationController를 Controller에 드래그앤드롭합니다.

그리고 Controller를 더블클릭합니다.

 

Animator 윈도우가 나타납니다.

 

 

 

 

 

Parameters 탭에서 Float을 생성합니다.

 

 

 

Float을 두개 생성해서 하나는 Grip, 하나는 Trigger라고 이름을 변경합니다.

 

 

 

From New Blend Tree를 생성합니다.

 

 

 

 

Brend Tree를 더블클릭합니다.

 

 

 

Brend Type을 2D Freeform Cartesian으로 변경합니다.

 

 

 

Parameters를 Grip과 Trigger로 지정합니다.

 

 

Motion Field를 4개 추가합니다.

 

 

 

 

 

 

 

l_hand_default_anim 폴더에 l_hand_idle을 첫번째 Motion Field에 연결합니다.

 

 

 

l_hand_pinch_anim 폴더에 l_hand_pinch를 두번째 Motion Field에 연결하고 Pos Y를 1로 설정합니다.

 

 

l_hand_fist_anim폴더에 l_hand_grip을 세번째 Motion Field에 연결하고 PosX: 1로 설정합니다.

 

 

 

네번째 Motion Field는 l_hand_grip을 연결하고 PosX: 1 PosY: 1로 설정합니다.

 

 

Trigger를 0으로 설정합니다.

Grip(X 좌표)과 Trigger(Y 좌표) 슬롯을 움직이면 붉은 점이 이동하는것을 확인 할 수 있습니다.

 

 

 

Starter Assets에서 XRI Default Input Actions를 더블 클릭해서 창을 띄웁니다.

 

 

 

XRI LeftHand Interaction Action Maps에서 각 Actions에서 어떤 Action Properties를 제공하는지 확인 할 수 있습니다.

창을 닫습니다.

 

 

 

VR_Hands > LeftHandPrefab에서 Add Component해서 New Script에서 HandsAnimation 스크립트를 추가합니다.

 

 

 

스크립트를 더블클릭합니다.

 

 

 

 

 

 

9. 스크립트 작성 

VS Studio가 실행됩니다.

 

 

 

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

public class HandsAnimation : MonoBehaviour
{
    [SerializeField] private InputActionReference gripReference;

    // Update is called once per frame
    void Update()
    {
        float gripValue = gripReference.action.ReadValue<float>();
        Debug.Log(gripValue);
    }
}

 

위와 같이 코딩합니다.

 

 

 

LeftHandPrefab에서 Grip Reference를 XRI LeftHand Interaction/Select Value로 지정합니다.

 

 

게임을 실행해서 왼쪽 컨트롤러 Grip 버튼을 누르면 Console창에서 Grip Value를 확인 할 수 있지만...

MacOS는 OpenXR이 지원되지 않기 때문에 PC 디버깅이 안된다는 진실..ㅠㅠㅠ

 

 

 

[SerializeField] private Animator handAnimator;

 

스크립트에서 handAnimator 변수를 선언해봅니다.

 

 

Unity에 Hand Animator 슬롯이 생성됩니다.

Animator를 연결해줍니다.

 

 

위와 같이 코딩을 추가합니다.

SetFloat의 첫번째 인자 "Grip"은 Animator Window에서 설정한 "Grip"입니다.

....

public class HandsAnimation : MonoBehaviour
{
    [SerializeField] private InputActionReference gripReference;

    [SerializeField] private Animator handAnimator;

    // Update is called once per frame
    void Update()
    {
        float gripValue = gripReference.action.ReadValue<float>();
        handAnimator.SetFloat("Grip", gripValue);
    }
}

 

 

 

왼쪽 컨트롤 Grip Animation이 작동하는것을 확인 할 수 있습니다.

 

 

 

triggerReference도 추가합니다.

 

 

 

...

public class HandsAnimation : MonoBehaviour
{
    ...

    [SerializeField] private InputActionReference triggerReference;

    ...

    // Update is called once per frame
    void Update()
    {
        ...

        float triggerValue = triggerReference.action.ReadValue<float>();
        handAnimator.SetFloat("Trigger", triggerValue);
    }
}

 

 

 

Trigger Reference는 XRI LeftHand Interaction/Activate Value를 연결합니다.

 

 

 

일반
Grip

 

Trigger

 

 

 

 

 

 

 

10. 오른쪽 컨트롤러 복제하기

LeftHandAnimationController를 command + D해서 복제하고 RightHandAnimationController로 이름을 변경합니다.

 

 

RightHandPrefab에서 Animator Component를 추가합니다.

 

 

Avatar를 r_hand_skeletal_lowersAvatar로 지정합니다.

 

RightHandAnimationController를 Controller에 연결합니다.

그리고 Controller를 더블 클릭합니다.

 

Grip과 Trigger, Blend Tree까지 다 있습니다.

BlendTree를 더블 클릭합니다.

 

 

left관련 Motion Field가 설정되어 있습니다.

 

 

right Motion Field로 변경합니다.

 

 

RightHandPrefab에서 Add Component해서 Hands Animation 스크립트를 추가합니다.

 

 

 

 

 

 

Grip Reference는 Select Value

Trigger Reference는 Activate Value를 지정하고,

Hand Animator는 Animator를 지정합니다.

 

 

 

왼쪽, 오른쪽 모두 잘 작동합니다.

 

 

 

 

 

 

11. Locomotion System

XR Origin에 Locomotion System을 추가합니다.

 

 

 

XR Origin을 XR Origin 슬롯에 연결합니다.

 

 

 

Continuous Move Provider (Action-based)를 추가합니다.

 

 

 

Locomotion System을 System 슬롯에 연결합니다.

 

 

 

왼쪽 손으로 이동하기 위하여 Left Hand Move Action 에 Use Reference를 체크하고

Reference에 XRI LeftHand Locomotion/Move를 지정합니다.

 

 

 

Continuous Turn Provider (Action-based)를 추가합니다.

 

 

 

Snap Turn Provider (Action-based)도 추가합니다.

 

 

 

XR Origin을 Continuous Turn Provider > System에 연결하고

오른쪽 손을 사용하기 위하여 Right Hand Turn Action > Use Reference를 체크합니다.

XRI RightHand Locomotion/Turn을 지정합니다.

 

 

Snap Turn Provider > System을 XR Origin을 연결하고

Turn Amount는 30도로 지정합니다.

오른쪽 Reference를 체크하고

XRI RightHand Locomotion/Snap Turn을 지정합니다.

 

 

 

 

Continuous Turn은 체크해제해서 사용하지 않겠습니다.

 

 

 

 

 

PolygonStarter > Prefabs > SM_PolygonPrototype_Prop_Crate_03을 Scene에 추가합니다.

 

 

 

 

객체를 복제해서 (command + D) 장면을 만듭니다.

 

 

 

 

Material을 적용합니다.

 

 

 

왼손으로는 이동, 오른손으로는 회전을 할 수 있습니다.

 

 

 

 

상자쪽으로 이동하면 상자를 뚫고 지나갑니다.

 

 

 

 

 

 

12. Character Controller

XR Origin에 Character Controller 를 추가합니다.

 

 

 

 

Chracter Controller 수치를 그림처럼 조절합니다.

 

 

 

 

 

 

Character Controller는 상자와 부딛치게 됩니다.

 

 

 

 

Continuous Move Provider의 Gravity Application Mode가 Attempting Mode로 되어 있습니다.

이것은 움직임이 있을때 중력이 적용되는데,

XR Origin의 Y축이 0.621로 설정했는데, 움직이기 시작하면 땅바닥에 떨어지는것을 확인 할 수 있습니다.

Immediately로 변경해서 즉시 중력이 적용되도록 설정합니다.

 

 

 

 

Character Controller Provider를 추가합니다.

 

 

 

 

 

Locomotion Provider를 XR Origin으로 설정하고

Min Height를 0.3 으로 설정합니다.

 

 

 

 

13. 장면 꾸미기

 

 

 

 

 

 

14. 물건잡기

Left, RightHandController를 선택하고 XR Direct Interacter를 추가합니다.

 

 

Sphere Collider도 추가합니다.

 

 

 

is Trigger를 체크하고

Radius를 0.1로 수정합니다.

 

 

 

 

 

 

Cube를 하나 추가합니다.

 

 

 

Reset Transform 하고 Scale을 0.1로 변경합니다.

 

 

 

 

Cube의 위치를 옮겨주고

XR Grab Interactable을 추가합니다.

 

 

 

 

Movement Type은 Instantaneous, Kinematic, Velocity Tracking 3가지가 있는데,

첫번째 Cube는 디폴트인 Instantaneous를 유지합니다.

 

 

 

 

두번째 Cube는 Kinematic으로 변경합니다.

 

 

 

마지막으로 Velocity Tracking으로 변경합니다.

Material도 각각 적용합니다.

 

 

 

 

 

Instantaneous는 물체를 진지하지 못하고 통과합니다.

 

 

 

 

Kinematic도 마찬가지 입니다.

 

 

 

 

Velocity Tracking은 다른 물체와 상호작용합니다.

 

 

 

 

Instantaneous와 Kinematic의 차이점은 다른 물체를 부딛혔을때 Kinematic이 조금 더 자연스러움에 있습니다.

 

 

 

 

3개의 cube를 삭제하고

총과 방패와 검을 추가해서 XR Grab Interactable을 적용합니다.

 

 

 

방패는 Kinematic을 적용하고

 

 

 

 

검은 Velocity Tracking을 적용합니다.

 

 

 

 

 

총과 방패와 검을 잡아봅니다.

하지만 잡히는 위치가 정확하지 않습니다.

 

 

 

 

방패를 선택하고 Add Layer를 선택합니다.

 

 

 

 

Interactabies와 Player를 지정합니다.

 

 

 

총과 방패와 검은 Interactabies 레이어로 지정합니다.

이때 모든 자식 오브젝트를 레이어에 포함시킵니다.

 

 

 

 

XR Origin은 Player 레이어를 지정합니다.

XR Origin은 모든 자식레이어를 포함하지 않고, Object만 Player 레이어에 포함합니다.

 

 

 

 

Project Settings > Physics에서 Player와 Interactabies는 체크해제 합니다.

 

이것은 캐릭터와 물건이 상호작용하는것을 해제합니다.

 

 

 

 

 

총을 선택하고 Create Empty를 생성해서 AttachTrasform 이름을 지정합니다.

 

 

 

총의 Attach Transform에 AttachTransform을 연결합니다.

 

 

 

 

방패와 검에도 AttachTransform을 추가하고,

총, 방패, 검을 선택해서 Use Dynamic Attach를 활성화 합니다.

 

 

 

이제 어떤 위치든 잡을 수 있습니다.

 

 

 

 

정확한 위치를 잡아봅니다.

 

 

 

 

Play해서 Dynamic Attach의 Transform을 복사해서 총의 AttachTransform에 붙여 넣기 합니다.

그리고 Dynamic Attach를 선택해제 합니다.

 

 

 

 

방패(Kinematic)와 검(Velocity Tracking)의 움직임이 끊김이 생긴다면

Project Settings > Time > Fixed Timestep을 0.01로 조정해 줍니다.(게임 전체 속도가 느려질수 있음)

 

 

 

 

 

 

Left RightHandController > Haptic Event에서 On Select Entered를 체크하면 

물건을 잡을때 진동을 설정 할 수 있습니다.

 

 

 

 

 

15. 총알 발사

Sphere를 생성합니다.

 

 

 

Reset Transform하고 Scale을 0.05로 수정합니다.

 

 

 

 

Assets에 폴더를 추가합니다.

 

 

 

 

이름을 Material로 변경하고 Material을 추가합니다.

 

 

이름을 bullet으로 변경하고 색상을 변경합니다.

 

 

 

 

Sphere에 bullet 을 적용합니다.

 

 

 

 

 

 

Sphere이름을 bullet으로 변경하고

Assets에 폴더를 추가합니다.

 

 

 

이름을 Prefab으로 변경하고 bullet을 추가합니다.

그리고 Scene에서는 bullet을 삭제합니다.

 

 

 

총을 선택하고 Fire Script를 추가합니다.

 

 

 

Fire 를 더블클릭해서 VB Studio를 실행합니다.

 

 

 

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

public class Fire : MonoBehaviour
{
    [SerializeField] private GameObject bullet;
}

bullet을 선언합니다.

 

 

 

저장하고 Unity로 돌아와서 Bullet을 bullet으로 연결합니다.

 

 

 

 

총에서 Create Empty를 추가하고 SpawnPoint로 이름을 변경합니다.

 

 

 

 

Local로 변경하고 총알이 발사될 지점으로 좌표를 수정합니다.

 

 

 

 

 

그리고 Local을 Global로 변경합니다.

 

 

 

 

 

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

public class Fire : MonoBehaviour
{
    [SerializeField] private GameObject bullet;

    [SerializeField] private Transform spawnPoint;


    public void FireBullet()
    {
        Instantiate(bullet, spawnPoint.position, spawnPoint.rotation);
    }
}

위와같이 코딩합니다.

 

 

총에서 Interactable Event에 Activate에 +를 눌러 추가합니다.

Fire(Script)를 드래그해서 연결하고 Runtime Only는 Fire.Firebullet을 지정합니다.

Spawn Point는 SpawnPoint를 연결합니다.

 

 

 

 

총을 잡고 Trigger를 누르면 bullet Instance가 생성되는것을 확인 할 수 있습니다.

 

 

 

prefab > bullet 을 선택하고 Rigidbody를 추가합니다.

 

 

 

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

public class Fire : MonoBehaviour
{
    [SerializeField] private GameObject bullet;

    [SerializeField] private Transform spawnPoint;

    [SerializeField] private float bulletSpeed = 10f;

    public void FireBullet()
    {
        GameObject spawnBullet = Instantiate(bullet, spawnPoint.position, spawnPoint.rotation);
        spawnBullet.GetComponent<Rigidbody>().velocity = spawnPoint.forward * bulletSpeed;
    }
}

위와 같이 코딩합니다.

 

 

 

 

bullet Speed를 조절할 수 있습니다.

 

 

 

 

 

 

총알이 발사됩니다.

 

 

 

Collision Direction을 Continuous로 변경합니다.

 

 

 

 

...

public class Fire : MonoBehaviour
{
    ...
    public void FireBullet()
    {
        ...
        Destroy(spawnBullet, 5f);
    }
}

5초후에 총알이 사라지도록 코딩합니다.

 

 

 

 

 

 

 

 

16. 타겟 만들기

https://assetstore.unity.com/packages/3d/props/lowpoly-training-dummy-202311

타겟을 Asset에 추가합니다.

 

 

dummy를 다운로드해서 Import 합니다.

 

 

 

 

Traning_dummy를 추가합니다.

 

 

 

 

 

 

 

Window > Rendering > Render Pipeline Converter를 선택합니다.

 

 

옵션을 모두 선택하고 Initialize Converters를 누르고 ,Convert Assets를 적용합니다.

 

 

 

URP가 적용되었습니다.

 

 

 

 

 

17. 타겟 스크립트

bullet을 선택하고 Add Tag를 누릅니다.

 

 

 

+를 누르고 bullet을 추가합니다.

 

 

bullet의 tag를 bullet을 적용합니다.

 

 

 

Target Dummy 스크립트를 추가합니다.

 

 

 

 

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

public class TargetDummy : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Bullet"))
        {
            Debug.Log("I've been hit");
        }
    }
}

스크립트를 더블클릭해서 위와 같이 코딩합니다.

 

 

 

 

 

 

Training dummy를 선택하고 Box Collider를 추가합니다.

 

 

 

 

Edit Collider를 선택하고 크기를 수정합니다.

 

 

 

 

 

 

18. 문 열기

WallDoor를 배치합니다.

 

 

 

 

 

Door를 배치합니다.

 

 

 

 

 

Door를 WallDoor 자식으로 넣어주고, Reset Trasnform 합니다.

 

 

 

 

 

문이 열릴수 있도록 위치를 조절합니다.

 

 

 

 

 

RigidBody를 추가합니다.

 

 

 

 

중력은 해제합니다.

 

 

 

 

Hinge Joint를 추가합니다.

 

 

 

Y축으로 1을 설정합니다.

 

 

손잡이를 만들기 위해 Door에 Create Empty를 생성하고 손잡이 위치로 옮깁니다.

 

 

 

Sphere Collider를 추가합니다.

 

 

 

Radius를 0.1로 변경합니다.

 

 

 

 

 

Rigidbody를 추가합니다.

 

 

 

중력은 해제합니다.

 

 

 

 

XR Grab Interactable을 추가합니다.

 

 

 

Fixed Joint도 추가합니다.

 

 

 

 

 

Conected Body에 wall door를 연결합니다.

 

 

 

 

 

 

문을 열면 이상한 현상이 발생합니다.

 

 

 

 

프레임을 Frame 레이어에 Object만 추가합니다.

 

 

 

 

Door는 Door 레이어에 모두 추가합니다.

 

 

 

Project Setting > Physics에서 Frame과 Door를 체크해제 합니다.

 

 

 

 

손잡이 Movement Type은 Velocity Tracking으로 설정합니다.

 

 

 

 

자연스럽게 문이 열립니다.

 

 

 

그런데 문을 세게 닫으면 무한 회전합니다.

 

 

 

 

use Limits를 Max: 90으로 변경합니다.

 

 

 

 

 

손잡이를 복제해서 반대편 손잡이에도 복사합니다.

 

 

 

 

 

 

 

Use Spring, Use Motor를 체크해서 문이 자동으로 닫히는것을 설정할 수 있습니다.

 

 

 

 

 

 

19. 타켓 더미 에니메이션

Training_dummy의 Animator를 체크하고, Controller를 더블클릭해서 Animator를 엽니다. 

 

 

 

 

 

+를 누르고 BoolTrigger를 두개 추가합니다.

 

 

 

 

 

각각 Activate, Death로 이름을 정합니다.

 

 

 

 

Training > Mesh에서 died와 pushed 에니메이션을 확인 해 볼 수 있습니다.

 

 

 

 

 

died를 선택하고 command + d를 눌러 복제하고 IDLE로 이름을 변경합니다.

 

 

 

 

IDLE을 더블클릭해서 Animation을 엽니다.

마지막 키프레임을 제외하고 모두 선택해서 삭제합니다.

 

 

 

 

마지막 키프레임을 선택해서 시작 위치로 이동합니다.

 

 

 

 

 

 

Create State > Empty를 합니다.

 

 

 

이름을 idle로 바꾸고 Default State로 변경합니다.

 

 

 

 

Pushed 노드는 삭제하고 Create State > Empty 해서 Activate, Dead로 변경합니다.

 

 

 

 

Idle을 선택하고 IDLE 메쉬를 Motion으로 연결합니다.

 

 

 

 

 

Dead를 선택하고 died를 연결합니다.

 

 

 

Activate는 died를 연결하고 속도를 -1로 설정합니다.

 

 

 

Idle과 Activate를 연결합니다.

 

 

 

 

 

transition 라인을 선택해서 Has Exit Time을 선택해제하고

Duration을 0으로 설정합니다.

+를 눌러 Condition을 추가하고 Activate를 설정합니다. -> Activate는 미리 생성한 Parameter 입니다.

 

 

 

Activate와 Dead를 연결하고, 위와같이 설정하고

Condition은 Death로 설정합니다.

 

 

 

 

20. 타켓 더미 에니메이션 스크립트

앞에서 만든 TargetDummy 스크립트를 엽니다.

 

 

 

 

 

 

...

public class TargetDummy : MonoBehaviour
{
    [SerializeField] private Animator dummyAnimator;

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Weapon"))
        {
            dummyAnimator.SetTrigger("Death");
        }
    }

    public void ActivateDummy()
    {
        dummyAnimator.SetTrigger("Activate");
    }
}

 

위와 같이 코딩합니다.

총과 검을 Weapon Tag로 추가해야합니다.

 

 

Animator를 Dummy Animator에 연결합니다.

 

 

 

 

 

Tag를 추가합니다.

 

 

Weapon을 추가합니다.

 

 

 

 

칼을 Weapon으로 지정합니다.

 

 

 

총알도 Weapon으로 변경합니다.

 

 

 

 

dummy가 다시 살아나는 포인트를 만들기 위해 Floor를 추가합니다.

 

 

 

is Trigger를 체크해제하고 Edit Collider를 누르고 크기를 키워줍니다.

 

 

 

DummyTrigger 스크립트를 추가합니다.

 

 

 

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

public class DummyTrigger : MonoBehaviour
{
    [SerializeField] private GameObject[] targetDummies;

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            foreach (GameObject dummies in targetDummies)
            {
                dummies.GetComponent<TargetDummy>().ActivateDummy();
            }
        }
    }
}

위와 같이 코딩합니다.

 

 

 

training_dummy를 3개더 복제하고,

floor에 TargetDummies 배열에 2개의 target_dummy를 추가해줍니다.

 

 

floor를 하나더 복제해서 나머지 target_dummy를 추가해줍니다.

 

 

 

 

 

XR Origin을 Player 태그에 넣어줍니다.

 

 

 

 

 

 

 

21. 광선 만들기

Create Empty 합니다.

 

 

 

 

 

LeftHandRay로 이름 짓고, 복제해서 RightHandRay로 이름을 변경합니다.

 

 

 

 

XR Controller를 추가합니다.

 

 

 

 

 

LeftHandRay를 선택하고 XRI Default Left Controller를 선택합니다.

 

 

 

 

 

RightHandRay를 선택하고 XRI Default Right Controller를 선택합니다.

 

 

 

 

 

두개를 선택하고 XR Ray Interactor를 추가합니다.

 

 

 

 

Interactor Manager를 XR Interaction Manager로 선택합니다.

 

 

 

 

XR Interactor Line Visual을 추가합니다.

 

 

 

 

 

 

Line Width를 0.02로 조절합니다.

 

 

 

 

 

 

두개를 선택하고 Line Renderer를 추가합니다.

 

 

 

 

width를 적당히 줄여줍니다.

 

 

 

Material을 생성합니다.

 

 

 

 

Shader를 Alpha Blended Premultiply로 변경합니다.

 

 

 

두개의 HandRay를 선택해서 LineMaterial을 적용합니다.

광선은 이제 렌더링 됩니다.

 

 

 

광선이 표시됩니다.

 

 

 

 

 

 

22. UI 만들기

Canvas를 만듭니다.

 

 

 

 

엄청나게 큰 Canvas가 생성됩니다.

 

 

 

 

 

 

Render Mode를 World Space로 변경하고, 크기와 위치를 조절합니다.

 

 

 

 

 

 

Canvas안에 Button을 만듭니다.

 

 

 

 

Slider도 만듭니다.

 

 

 

 

Button과 Slider의 크기와 위치를 적당히 조절합니다.

 

 

 

 

 

 

Dropdown도 하나 만들고, Panel도 추가합니다.

 

 

 

 

Panel의 색상을 수정합니다.

 

 

 

 

 

Canvas에 Tracked Device Graphic Raycaster를 추가합니다.

 

 

 

 

EventSystem에서 Standalone Input Module은 제거합니다.

 

 

 

 

XR UI Input Module을 추가합니다.

 

 

 

 

XRI Default XR UI Input Module을 선택합니다.

 

 

 

 

 

 

 

 

 

 

Invalid Color Gradient에서 Alpha값을 0으로 변경합니다.

 

 

 

 

Blocked Color Gradient도 Alpha값을 0으로 변경합니다.

 

 

 

Valid Color Gradient의 Alpha값은 적당히 줄여줍니다.

 

 

 

 

XR Ray Interactor에서 Raycase Mask를 UI만 설정합니다.

 

 

 

 

 

이제 UI에서만 광선이 표시됩니다.

 

 

 

 

 

 

23. UI 스크립트

Dropdown에서 Option C를 삭제하고,

Snap Turn, Continous Turn으로 설정합니다.

 

 

 

 

Cavas에 DropdownScript를 추가합니다.

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class DropdownScript : MonoBehaviour
{
    [SerializeField] private ActionBasedSnapTurnProvider snapTurn;

    [SerializeField] private ActionBasedContinuousTurnProvider continuousTurn;

    public void TurnProviderSelect(int index)
    {

    }
}

 

위와 같이 코딩합니다.

 

 

 

 

Unity로 돌아와서 Dropdown에서 +를 누르고 Cavas를 연결합니다.

 

 

 

Function에 TurnProviderSelect를 지정합니다.

 

 

 

 

...

public class DropdownScript : MonoBehaviour
{
    ...

    public void TurnProviderSelect(int index)
    {
        if (index == 0)
        {
            snapTurn.enabled = true;
            continuousTurn.enabled = false;
        }

        if (index == 1)
        {
            snapTurn.enabled = false;
            continuousTurn.enabled = true;
        }
    }
}

코드를 추가합니다.

 

 

 

Snap Turn과 Continous Turn을 XR Origin으로 각 연결합니다.

 

 

 

 

 

 

Snap Turn과 Continous Turn을 확인 할 수 있습니다.

 

 

 

 

Button을 Exit로 설정합니다.

 

 

 

...

public class DropdownScript : MonoBehaviour
{
    ...

    public void Exit()
    {
        Application.Quit();
    }
}

Exit 메서드를 추가합니다.

 

 

 

Button에 Canvas를 연결합니다.

 

 

Exit 메서드를 지정합니다.

 

 

 

 

Exit 버튼 동작을 확인 할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

https://www.youtube.com/watch?v=TJ8yk5vVwI0

 

 

 

 

Blender, Unity 목록

 
 
 
 
반응형