충돌한 콜라이더의 오브젝트 정보를 체크한다. 입력 포트(Input Port)는 어떤 조건에서 어떤 오브젝트와의 충돌을 감지할 것인가를 세팅하고 출력 포트(utput Port)는 출돌한 오브젝트에 대한 RadycastHit2D 정보를 제공한다.

Physics2D.CircleCast

origin(좌표) 위치에서 direction(방향)으로 distance(거리) 만큼 떨어져 있는 곳에 radius(반지름) 크기의  Circle이 있는데 이 Circle에 layerMask(타겟오브텍트의 레이어 이름)가 충돌이 되는지를 감지한다.

 

위의 설명만으로는 이해하기 어려워서 아래와 같은 예시를 작성해 보았다.

캐릭터의 왼손 끝부분에서 Enemies라는 오브젝트가 탐지되면 반응하도록 하는 예시이다.

2D 캐릭터가 칼을 가지고 있고 칼을 휘둘러서 적을 때리는 것을 구현할 때 사용한다.

Physics2D.CircleCast

 

참고로 Physics2D.Raycast 는 origin 위치에서 direction 방향으로 distance 까지 광선(ray)를 쏴서 llayerMask(타겟 오브젝트의 레이어)와 충돌이 생기는 것을 감지하도록 한다.

Physics2D.Raycast

'VS 유닛' 카테고리의 다른 글

Add, Subtract, Multiply, Divide 유닛들  (0) 2021.09.05
On Collision Enter 2D & On Trigger Enter 2D  (0) 2021.08.31
Formula 유닛  (0) 2021.08.29
Null 유닛  (0) 2021.08.29
변수 유닛  (0) 2021.08.27

각 아미지의 우측 하단 콘솔창을 보면 Debug.Log에서 출력한 메시지를 확인할 수 있습니다.

Debug.Log가 4개 이니 4개의 Add(더하기)결과가 나오고 있습니다.

기본 스칼라값과 백터에 대한 더하기가 되고 있습니다.

Add Units

위의 Add설명과 동일합니다. 단지, 빼기일 뿐입니다.

Subtract Units

위의 Add설명과 동일합니다. 단지, 곱하기일 뿐입니다.

Multiply Units

위의 Add설명과 동일합니다. 단지, 나누기일 뿐입니다.

Divide Units

'VS 유닛' 카테고리의 다른 글

Physics2D.CircleCast  (0) 2021.09.06
On Collision Enter 2D & On Trigger Enter 2D  (0) 2021.08.31
Formula 유닛  (0) 2021.08.29
Null 유닛  (0) 2021.08.29
변수 유닛  (0) 2021.08.27

This Object가 다른 오브젝트와 충돌하기 전까지는 아무런 동작을 하지 않는다. 즉, 충돌했을 때 반응을 한다.

예를 들면 Plyer 캐릭터가 적과 충돌을 했을 때 혹은 총에 맞았을 때 HP가 감소하거나 죽도록 할 수 있다.

On Collision Enter 2D

 

On Collision Enter 2D : Outputs

사용 예시)

This와 충돌한 대상의 GameObject => Compont => Layer 를 가져온다. 그게 Enemy Layer 인지 비교한다.

True면 Enemy와 충돌을 했다는 뜻이다.

On Collision Enter 2D : Example

 

* On Trigger Enter 2D : 충돌에 대한 물리적 처리 없이 오브젝트의 충돌 자체만을 체크한다. 즉, 아래의 Collider 출력은 출돌한 대상에 대한 정보가 제공된다.

On Trigger Enter 2D

'VS 유닛' 카테고리의 다른 글

Physics2D.CircleCast  (0) 2021.09.06
Add, Subtract, Multiply, Divide 유닛들  (0) 2021.09.05
Formula 유닛  (0) 2021.08.29
Null 유닛  (0) 2021.08.29
변수 유닛  (0) 2021.08.27

Formula(공식)은 수식과 인수의 목록을 이용하여 작성된 논리식와 수학식을 평가하는 강력한 유닛이다.

 

참고: 이진 트리를 순회해야 하는 과부담 때문에(캐슁을 사용함에도 불구하고), Formular 유닛을 사용할 경우 성능이 일반 연산자 유닛들을 개별적으로 사용하는 것보다 성능이 상당히 떨어지게 된다. 따라서 매 프레임에서 이 유닛들이 사용되는 것은 피하는 것이 바람직하다. 

일반적으로 Formula는 참/거짓의 논리 값이나 수학의 숫자를 반환하지만, 실제로는 어떤 타입의 값도 반환할 수 있다.

해더의 첫 번째 텍스트 필드에는 Formula 자신이 들어가 있다.

두 번째 텍스트 필드는 인수의 수이다. 기본적(default)으로 2가 설정되어 있는데, 이는 입력으로 A와 B를 제공한다는 뜻이다. Formula은 최대 10개의 인수를 가질 수 있으며, 항상 알파벳 순으로 정렬된다. 즉, B, C, D, E 등으로 호출된다.

 

예를 들어, 아래 Formula는 다음의 두 가지 내용이 맞는지(참인지)에 대한 Boolean 값을 반환한다.

  • 시간이 10초를 경과하였는지 여부 그리고
  • 현재의 게임 오브젝트 이름이 "Player"인지 여부

Arguments(인수들)

변수 이름(Variable Names)

변수 이름들은 Formula에 직접적으로 사용할 수 있다. 예를 들어, 'health"라는 이름의 graph 변수는 'health > 50'이라는 공식으로 작성해서 불리언(참/거짓) 값을 리턴 받을 수 있다. 인수 이름은 다음과 같은 우선 순위로 평가된다.

  1. 알파벳 인수 이름(a - z)
  2. Graph 변수 이름
  3. Object 변수 이름
  4. Scene 변수 이름
  5. Application 변수 이름
  6. Saved 변수 이름

속성(Properties)과 메서드(Methods)

[arg.prop] 표기법을 사용하여 인수 또는 변수에 대한 속성 값을 확인한다. 예를 들어 만약, Position이 Vector3 Object 변수인데 그 값이 0인지 체크하고자 한다면 [position.x] = 0라고 하면 된다. [arg.Method()] 표기법을 사용하여 매개 변수가 없는 메서드의 반환값을 얻을 수도 있다.

 

참고: AOT 사전 빌드(pre-build)에서는 이름으로만 액세스되는 멤버에 대해 스텁(stubs)을 생성할 수 없기 때문에 속성 및 메서드에 액세스하는 것이 AOT 플랫폼과 호환된다고 확신할 수는 없다.

 

Literals(리터럴스)

고정 값(fixed value)을 할당하려면 다음 리터럴(literal)을 사용하십시오.

리터럴설명예

Literal Description Example
Number integer 또는 float 3.5
String 어포스트로피로 감싸진 텍스트 "Hello World!!"
Boolean 부울 값 true, false
Null null 상수 a != null
Delta time Unity 프레임 델타 시간 30 * dt
Invert Delta Time 델타 시간의 역. 30/second

 

Operators(연산자)

모든 논리 연산자와 수학 연산자는 Formula에 사용가능하다. 스크립트에서 사용자 정의 연산자(custom operator)를 통해 정의된 연산자도 사용할 수 있다.

연산자작전순위결과예

Operator Operation Rank Result Example
not, ! 논리 부정 단항 피연산자 부정 not true
- 음수 단항 피연산자에 음수를 적용 -5
and, && 논리곱 이항 두 피연산자가 모두 true인 경우 true. (a < 5) and (b > 3)
or, || 논리합 이항 어느 피연산자가 true인 경우 True (a < 5) or (b > 3)
=, == 동등(같음) 이항 두 피연산자가 같으면 true이다. a = b
!=, <> 불일치(다름) 이항 두 피연산자가 같지 않으면 true이다. a != b
<, <=, >, >= 숫자 비교 이항 숫자의 비교 연산 a >= 10
+ 덧셈 이항 두 피연산자의 합계 a + 5
- 뺄셈 이항 두 피연산자 간의 차이 b - 3
* 곱셈 이항 두 피연산자의 곱 12 * a
/ 나눗셈 이항 두 피연산자의 . b / 2
% 모둘 이항 두 피연산자의 나머지 a % 2
?: If
(삼항연산자)
삼항 조건이 true일 경우 왼쪽 피연산자, 그렇지 않을 경우 오른쪽 피연산자 (health > 0) ? "Alive" : "Dead"

~와 >>와 같은 모든 비트 연산자(bitwise operators)도 지원한다.

 

 

Functions(함수들)

다음 표에 있는 모든 함수를 사용할 수 있다.

Name Result Example
abs 지정된 숫자의 절대값. abs(-1)
acos 아크코사인, 코사인의 역함수. acos(1)
asin 아크사인, 사인의 역함수. asin(0)
atan 아크탄젠트, 탄젠트의 역함수. atan(0)
ceiling 지정된 숫자보다 크거나 같은 최소 정수. ceiling(1.5)
cos 지정된 각도의 코사인. cos(0)
exp 지수함수. exp(0)
floor 지정된 숫자보다 작거나 같은 최대 정수. floor(1.5)
log 지정된 숫자의 로그. log(1, 10)
log10 상용로그 log10(1)
max 지정된 두 숫자 중 더 큰 숫자. max(1, 2)
min 두 숫자 중 작은 숫자. min(1, 2)
pow 숫자를 지정된 만큼 거듭제곱 pow(3, 2)
round 값을 가장 가까운 정수 또는 지정된 소수 자릿수로 반올림한다. round(3.222, 2)
sign 음수인지 양수인지 판단, 1은 양, -1이은 음. sign(-10)
sin 지정한 각도의 사인. sin(0)
sqrt 지정된 숫자의 제곱근. sqrt(4)
tan 지정한 각도의 탄젠트. tan(0)
truncate 소수이하 버림, 정수 부분만 채택. truncate(1.7)
v2 2D 벡터 생성 v2(0, 0)
v3 3D 벡터 생성 v3(0, 0, 0)
v4 4D 벡터 생성 v4(0, 0, 0, 0)

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-formula.html

'VS 유닛' 카테고리의 다른 글

Add, Subtract, Multiply, Divide 유닛들  (0) 2021.09.05
On Collision Enter 2D & On Trigger Enter 2D  (0) 2021.08.31
Null 유닛  (0) 2021.08.29
변수 유닛  (0) 2021.08.27
Custom Visual Script Event 유닛 만들기  (0) 2021.08.26

Null 유닛은 null 값을 처리한다. Null은 "값 없음, nothing"을 의미하는 프로그래밍 개념이다.

Null 유닛

Null 유닛은 항상 null 값을 반환한다. Unity 오브젝트 참조 필드를 비워 두면("None") 자동으로 null을 의미하는 것이다.

Null 체크

Null check는 null과의 동등 비교를 수행하는 if문의 단축형 이다. 값이 null인지 여부에 따라 다른 방향으로 흐름이 진행되도록 하는데 편리하다.

예를 들어, Transform이 hierarch에 부모를 가지고 있는가 아닌가에 따라서 다르게 처리하는 데 사용될 수 있다.

Null Coalesce(널 병합)

Null Coalesce 유닛은 오리지널 입력이 null인 경우를 대비하여 fallback 값을 줄 수 있다.

아래 예시는 Null Coalesce 유닛에 Audio Source 클립이 누락된 경우를 대비하여 Fallback 클립을 연결해 놓고 있다.

(역자주 - 아래 이미지에서 Fallback 클립도 None이어서 이역시 null임. None아 아닌 음원 소스가 있어야 정상님)

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-nulls.html

'VS 유닛' 카테고리의 다른 글

On Collision Enter 2D & On Trigger Enter 2D  (0) 2021.08.31
Formula 유닛  (0) 2021.08.29
변수 유닛  (0) 2021.08.27
Custom Visual Script Event 유닛 만들기  (0) 2021.08.26
Custom Event 유닛 만들기  (0) 2021.08.26

변수(variable) 유닛은 6종류가 있다. 이들 변수 유닛 각각은 세 가지 오브젝트 유닛이 존재한다..

  • Get : 변수 값 인출하기(얻기)
  • Set : 변수에 새로운 값 할당하기(저장하기)
  • Is Defined : 변수가 정의되어 있는지 체크하기

이것들은 퍼지 파인더의 변수 분류(Variables category)에 위치한다.

변수 유닛들은 청녹색을 띄고 있다.

동적 형변환(Dynamic Typing)

Get / Set 유닛들에 대해 변수들은 정적으로 입력되지 않는다. 즉 변수 타입이 실시간으로 변경될 수 있음을 의미한다. 그 타입이 Blackboard 창에 정의되면 오브젝트 처럼 표시된다.

Get Variable - 변수에서 값 얻기

get 변수 유닛은 입력으로서 변수의 이름이 필요하며, 출력으로 Value를 반환한다.

Set Variable - 변수에 값 할당(저장) 하기

set 변수 유닛은 변수의 이름과 변수에 할당될 새로운 값이 필요하다. 레이아웃은 편의를 위해 출력으로 동일한 값을 반환한다.

 

참고: 변수에 값이 할당되는 타임을 잡는 제어 입력 포트는 연결이 반드시 있어야 한다. 선택적으로 제어 출력 포트는 저장(set) 이후에 어떤 작업을 할 것인가에 따라 연결할 수 도 있다.

아직 생성되지 않은 변수 이름으로 set 할 수도 있다. 그러면 자동으로 생성된다.

Is Variable Defined - 변수가 정의되어 있는지 체크하기

is variable defined 유닛은 변수의 이름을 입력으로 받아서 그 이름의 변수가 있는지 없는지를 판단 후 Is Defined boolean 으로 반환(출력)한다. 변수가 생성되었는지 확인하는 데 유용하며, 생성되지 않은 경우에는 fallback 값을 제공하는 경우가 많다.(역자 주 - 아래의 경우 score 변수가 있다면 score 값을 출력하고 없다면 0 값을 출력한다.)

참고: Get Variable 유닛을 선택 하고 그래프 인스펙터에서 Fallback 체크 박스에 체크를 하면 더 쉽게 같은 작업을 수행할 수 있다. 이렇게 하면 변수가 정의되지 않은 경우 반환되는 유닛에 fallback 입력이 추가된다.

동적 변수(Dyanmic Variables)

변수의 이름은 표준 값 입력 포트이기 때문에 문자열(string)을 반환하는 다른 포트에 연결할 수도 있다. "동적 변수"이기 때문에 플레이 모드가 실행중에는 변수가 변경된다.(역자주 - int 변수를 string 변수에 연결하면 string 변수가 플레이 모드일 때 int 변수로 변경된다.)

오브젝트 변수(Object Variables)

오브젝트 변수 유닛은 추가적인 입력 포트가 있다. 그 포트에는 참조하고 있는 변수가 정의된 게임 오브젝트를 연결해야 한다. 기본적으로는 현재 오브젝트(self, This)를 바라보도록 설정되어져 있다.

예를 들어 Get Variable 유닛은 플레이어2 오브젝트에 있는 health 변수의 값을 얻는다.

변수의 종류와 이름은 드롭다운 메뉴를 통해 빠르게 세팅할 수 있다. 이름의 우선 표시는 맥락상황에 따라 달라지는데 해당 종류의 변수가 존재하는 상황인가 그리고 현재 그래프에 다른 변수 유닛이 있는 상황인가에 기반한다.

드래그 앤 드랍(Drag and Drop)

동일한 유닛을 그래프에 직접 만들려면 블랙보드 창의 변수 항목을 그래프 창에 직접 끌어다 놓으면 된다.

  • 기본적(default)으로 Get 유닛이 생성된다.
  • Alt 키를 누른 경우 Set 유닛이 생성된다.
  • Shift 키를 누른 경우 Is Defined 유닛이 생성된다.

 

변수 API(Variables API)

비주얼 스크립팅은 변수를 쉽게 다룰 수 있는 API를 제공하고 있다. 즉, get, set 그리고 is variable defined를 쉽게 처리할 수 있다. 이러한 모든 처리는 변수 클래스(Variables class)에서 가능하다.

예를 들면 다음과 같다.

Variables.Application.Set("score", 100);

Usings

API 액세스하기 위해서는 C# 스크립트에 다은의 using을 추가해야 한다.

using Unity.VisualScripting;

 


Scope

Graph(그래프) - Graph Variable

그래프 상에서만 액세스되는 변수에 액세스하려면, Graph 변수를 만들면 된다. 이것은 기본적으로 루트 머신에서 Graph 영역으로 한정된(중첩된) 경로만 지칭하게 된다.

 

며신 상에서 루트 Graph를 가져오려면:

var graphReference = GraphReference.New(flowMachine, true);

중접 Graph에 액세스하려면 추가 매개변수들로써 부모 노드를 전달한다;

var graphReference = GraphReference.New(flowMachine, new IGraphParentElement[] { superUnit }true);

Graph 참조를 전달하는 방법;

Variables.Graph(graphReference)

 

 

Object(오브젝트) - Object Variable

Object에 존재하는 변수에 엑세스하려면:

Variables.Object(gameObject)

 

 

Scene(씬) - Scene Variable

Scene 변수에 액세스하려면 다음 중 하나를 수행한다.

Variables.Scene(scene)

또는:

Variables.Scene(gameObjectInScene)

또는:

Variables.ActiveScene

 

 

Application(어플리케이션) - Application Variable

Application 변수에 액세스하려면:

Variables.Application

 

 

Saved(저장) - Save Variable

저장된 변수에 액세스하려면:

Variables.Saved

 


활용(Operations)

아래 예에서 소문자 scope는 이전 scope 중 하나를 가리킨다.

 

Get

변수 값을 가져오려면 변수이름과 Get 메서드를 사용한다.

scope.Get("name");

변수는 엄격한 타입으로 사용되고 있지 않음에 주목하자. 즉, 아래 예시처럼 수동으로 캐스팅될 필요가 있다. 

int health = (int)Variables.Object(player).Get("health")

 

Set

변수의 값을 설정하려면 변수 이름, Set 메서드 그리고 값 매개 변수를 사용한다.

scope.Set("name", value);

예를 들면 다음과 같다.

Variables.Object(player).Set("health", 100);

변수는 엄격한 타입이 아니기 때문에 2번째 매개 변수로는 어떤 값도 전달할 수 있다. 심지어 현재 변수와 타입이 같지 않다도 된다. 

참고: 현재 존재하지 않는 변수 이름에 Set 메서드를 사용하면 새로운 변수가 자동으로 정의된다.

 

Is Defined

변수가 정의되었는지 확인하려면 변수이름과 IsDefined 메서드를 사용한다.

scope.IsDefined("name");

예를 들면 다음과 같다.

if (Variables.Application.IsDefined("score"))

    // ... 
}

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-variables-reference.html

'VS 유닛' 카테고리의 다른 글

Formula 유닛  (0) 2021.08.29
Null 유닛  (0) 2021.08.29
Custom Visual Script Event 유닛 만들기  (0) 2021.08.26
Custom Event 유닛 만들기  (0) 2021.08.26
Events unit  (0) 2021.08.25

이벤트 유닛은 프로그램이 실행되는 진입점으로 OnStart, OnUpdate, OnButton과 같은 것들이 있다. 다른 비주얼 스크립트 그래프가 이벤트를 전송할 수 있도록 하려면 Event Sender 유닛을 생성해야 한다.

사용자 정의 비주얼 이벤트(custom visual event)를 생성하는 프로세스는 다음과 같다.

  1. 단순한 custom event sender 유닛을 만든다.
  2. 프로그래밍을 통해(C# 스크립트 내에) 간단한 custom event를 트리거하는 스크립트를 생성한다.
  3. custom event를 수신하는 스크립트를 생성한다.

 

단순한 Custom Event 유닛 만들기

빈 이벤트 단위를 만들려면:

  1. 프로젝트에서 마우스 오른쪽 버튼을 클릭하고 Create > C# Script로 새로운 C# File 생성한다. 리네임하여 이벤트 유닛 이름으로 변경한다(예, MyEventNode.cs).
  2. 다음 코드를 스크립트에 복사, 붙여넣하고 저장한다.
    using Unity.VisualScripting; 
    using UnityEngine; 

    //Registering a string name for your custom event to hook it to an event. You can save this class in a separated file and add multiple events to it as public static strings. 
    public static class EventNames
    { 
        public static string MyCustomEvent = "MyCustomEvent";
    }

    [UnitTitle("On my Custom Event")]//Custom EventUnit to receive the event. Adding On to the unit title as an event naming convention. 
    [UnitCategory("Events\\MyEvents")]//Setting the path to find the unit in the fuzzy finder in Events > My Events. 
    public class MyCustomEvent : EventUnit<int>
    {
        [DoNotSerialize]// No need to serialize ports. 
        public ValueOutput result { get; private set; }// The event output data to return when the event is triggered. 
        protected override bool register => true; 

        // Adding an EventHook with the name of the event to the list of visual scripting events. 
        public override EventHook GetHook(GraphReference reference) 
        { 
            return new EventHook(EventNames.MyCustomEvent);
        } 
        protected override void Definition() 
        {
            base.Definition(); 
            // Setting the value on our port. 
            result = ValueOutput<int>(nameof(result));
        } 
        // Setting the value on our port. 
        protected override void AssignArguments(Flow flow, int data) 
        {
            flow.SetValue(result, data);
        }
    }
  3. Edit > Project Settings을 선택한다.
    Project Settings 창이 나타난다. 
  4. Project Settings 창에서 Visual Scripting을 선택하고 Regenerate Units를 클릭하여 퍼지 파인더에 새 유닛을 추가한다.
  5. 그래프에 새 이벤트 유닛을 추가하려면 스크립트 그래프의 백그라운드에 마우스 오른쪽 버튼을 클릭한다. 퍼지 파인더가 나타난다.
  6. Events > My Events > On my custom Event를 선택한다. Script Graph 창이 나타난다. 그래프가 아래 처럼 보여지게 된다.
    .

이벤트를 수신하였는지 확인하기 위해 event 값을 콘솔에 출력하도록 하는 Debug log 메시지를 출력하는 예는 아래와 같다.

 

Event Sender 유닛 만들기

사용자가 다른 그래프에서 이벤트 유닛을 트리거할 수 있도록 하려면 Event Sender 유닛을을 생성해야 한다. 이 유닛은 다른 그래프에서 이벤트를 방출하고 다른 그래프에 있는 이벤트에 값을 전달할 수 있다.

 

C# 스크립트에서 이벤트를 트리거할 수도 있다.

  1. 프로젝트에서 마우스 오른쪽 버튼을 클릭하고 Create > C# Script로 새로운 C# File 생성한다. 리네임하여 이벤트 유닛 이름으로 변경한다(예, SendMyEventNode.cs).
  2. 다음 코드를 스크립트에 복사, 붙여넣하고 저장한다.
    using Unity.VisualScripting; 

    //Custom Unit to send the event 
    [UnitTitle("Send My custom Event")]
    [UnitCategory("Events\\MyEvents")]//Setting the path to find the unit in the fuzzy finder in Events > My Events. 
    public class SendMyEvent : Unit
    {
        [DoNotSerialize]// Mandatory attribute, to make sure we don’t serialize data that should never be serialized. 
        [PortLabelHidden]// Hiding the port label as we normally hide the label for default Input and Output triggers. 
        public ControlInput inputTrigger { get; private set; }
        [DoNotSerialize]
        public ValueInput myValue;
        [DoNotSerialize]
        [PortLabelHidden]// Hiding the port label as we normally hide the label for default Input and Output triggers. 
        public ControlOutput outputTrigger { get; private set; } 

        protected override void Definition()
        {
            inputTrigger = ControlInput(nameof(inputTrigger), Trigger);
            myValue = ValueInput<int>(nameof(myValue),1);
            outputTrigger = ControlOutput(nameof(outputTrigger));
            Succession(inputTrigger, outputTrigger);
        }
     
        //Sending the Event MyCustomEvent with the integer value from the ValueInput port myValueA.
     
        private ControlOutput Trigger(Flow flow)
        {
            EventBus.Trigger(EventNames.MyCustomEvent, flow.GetValue<int>(myValue)); 
            return outputTrigger;
        }
    }
  3. Edit > Project Settings을 선택한다.
    Project Settings 창이 나타난다.
  4. Project Settings 창에서 Visual Scripting을 선택하고 Regenerate Units를 클릭하여 퍼지 파인더에 새 유닛을 추가한다.
  5. 그래프에 새로운 이벤트 유닛을 추가하려면 스크립트 그래프의 백그라운드에서 마우스 오른쪽 버튼을 클릭하고 Events > My Enents > Send My Custom Event를 선택한다.

     

 

Space 바를 눌렀다가 놓을 때 SendMyCustomEvent를 보내는 예는 아래와 같다.

참고: Send My Custom Event 유닛과 On My CustomEvent 유닛을 테스트하려면 다음 단계를 모두 수행한다.

  • custom evnet unit을 생성한다.
  • event sender 유닛을 생성한다.

 

Key up시 Event를 보내는 GameObject 추가

Key up시 Event를 보내기 위한 GameObject를 추가하려면;

  1. Hierarchy 윈도우에서 빈 GameObject를 새로 만들고 이름을 EventSender로 변경한다.
  2. Script Machine 컴포넌트를 추가한다.
  3. 스크립트 머신 컴포넌트에 새로운 스크립트 그래프를 추가한다.
  4. 그래프를 연다.
  5. 마우스 오른쪽 버튼을 클릭해서 퍼지 파인더를 연다.
  6. 퍼지 파인더에 "On Keyboard Input"를 검색하여 추가한다.
  7. 마우스 오른쪽 버튼을 클릭해서 퍼지 파인더를 연다.
  8. 퍼지 파인더에 "Send My custom Event"를 검색하여 추가한다.
  9. 두 노드를 연결한다.

키보드 입력(keyboard input)과 연결한 예는 아래와 같다.

 

이벤트를 수신하고 코드를 실행하는 GameObject 추가

이벤트를 수신하고 코드를 실행할 GameObject를 추가하려면:

  1. Hierarchy 윈도우에서 빈 GameObject를 새로 만들고 이름을 EventReceiver로 변경한다.
  2. Script Machine 컴포넌트를 추가한다.
  3. 스크립트 머신 컴포넌트에 새로운 스크립트 그래프를 추가한다.
  4. 그래프를 연다.
  5. 마우스 오른쪽 버튼을 클릭해서 퍼지 파인더를 연다.
  6. 퍼지 파인더에 "On my Custom Event"를 검색하여 추가한다.
  7. 마우스 오른쪽 버튼을 클릭해서 퍼지 파인더를 연다.
  8. 퍼지 파인더에 "Debug Log"를 검색하여 추가한다.
  9. 두 노드를 연결하십시오.

이벤트를 수신하고 이벤트 값을 콘솔에 출력하는 예는 아래와 같다.

한 번은 다음 단계를 완료해야 한다.

  1. setup을 테스트한다. 게임 스타트를 위해 "play button"을 누른다.
  2. 스페이스 바를 눌렀다 놓는다.
  3. Unity 콘솔에서 로그 메시지가 출력됐어야 한다.

 

코드에서 이벤트 트리거하기

C# 코드에서 이벤트 전송이 필요할 수도 있다. 다음 예는 컴포넌트 스크립트가 CodeTriggerCustomEvent를 호출하는 것으로 어떤 키가 눌렸을 때 이벤트를 트리거하는 클래스이다.

using Unity.VisualScripting; 
using UnityEngine; 

public class CodeTriggerCustomEvent : MonoBehaviour

    void Update()
    {
        if (Input.anyKeyDown)
        {
            //Triggering the previously created custom event MyCustomEvent with the integer value 2. 
            EventBus.Trigger(EventNames.MyCustomEvent, 2);
        }
    }
}

씬(scene)의 어느 GameObject에 작성한 스크립트를 추가한다.

Play 버튼을 누르고 아무 키를 누른다. 그 이벤트는 앞서 작성한 이벤트가 있는 씬의 어느 스크립트 그래프내에서 트리거되어야 한다. 

 

C# 코드에서 이벤트 수신하기

C# 스크립트가 비주얼 스크립트에서 트리거된 이벤트를 수신하려면:

  1. 프로젝트에서 마우스 오른쪽 버튼을 클릭하고 Create > C# Script로 새로운 C# File 생성한다. 리네임하여 이벤트 유닛 이름으로 변경한다(예, EventReceiver.cs).
  2. 다음 코드를 스크립트에 복사, 붙여넣기, 저장한다.public class EventReceiver : MonoBehaviour
    { 
        void Start() 
        {
            EventBus.Register<int>(EventNames.MyCrazyCustomEvent, i =>
            {
                Debug.Log("RECEIVED " + i);
            });
        }
    }
  3. 현재 씬(scene)의 Hierarchy 창에 있는 GameObject를 선택한다.
  4. 인스펙터(Inspector)에서 Add Component후에 EventReceiver를 선택한다.
  5. 만약, 씬(scene)에 event sender가 있다면 Play 모드로 진행이 되고 event를 트리거 할 것이다.
  6. Unity 콘솔에 숫자(i) 뒤에 "REVERSED" 메시지가 출력되어야 한다.

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-creating-custom-visual-script-event-unit.html

'VS 유닛' 카테고리의 다른 글

Null 유닛  (0) 2021.08.29
변수 유닛  (0) 2021.08.27
Custom Event 유닛 만들기  (0) 2021.08.26
Events unit  (0) 2021.08.25
Time Units  (1) 2021.08.24

Custom Event 유닛은 사용자가 지정한 인수를 통해 트리된다. Custom Event를 다른 그래프에서 트리거 하려면 Trigger Custom Event 유닛을 이용해야 한다. 즉, Trigger Custom Event (On Damage) => Custom Event (On Damage)

Custom Event를 만드는 방법 

스크립트 그래프에서:

  1. 빈 곳을 마우스 오른쪽 버튼을 클릭한다.
    퍼지 파인더가 나타난다.
  2. Events > Custom Event를 선택한다.
    Unity는 그래프에 Custom Event 유닛을 생성한다.
    참고: 첫 번째 인수는 Arg 0인 인덱스이다. 인수는 이벤트가 처리할 수 있는 값이다. 만약, 추가 데이터 포트가 필요하다면 인수 필드의 숫자를 필요한 수량의 숫자로 늘려주면 된다(예: 4개의 데이터 포트는 Arguments = 4).

참고: 송신자(sender)와 수신자(receiver) 유닛들은 동일한 갯 수의 인수(arguments)를 가져야 한다.

Custom Event를 트리거 하는 방법

역자주) 앞 단락에서 생성한 Custom Event를 발동시키는 방법이다.

스크립트 그래프에서:

  1. 빈 곳을 마우스 오른쪽 버튼을 클릭한다.
    퍼지 파인더가 나타난다.
  2. Events > Trigger Custom Event를 선택한다.
    참고: 이벤트의 이름은 Custom Event(이름은 대/소문자 및 공백 구분함)와 같아야 한다.
    트리거될 Custom Event가 있는 스크립트 머신(Script Machine) 컴포넌트를 소유한 게임 오브젝트가 게임 오브젝트 데이터 포트에 연결되어야 한다.
    Unity는 그래프에 Trigger Custom Event 유닛을 생성한다.
    첫 번째 인수는 Arg 0인 인덱스이다. 인수는 이벤트가 처리할 수 있는 값이다. 만약, 추가 데이터 포트가 필요하다면 인수 필드의 숫자를 필요한 수량의 숫자로 늘려주면 된다(예: 4개의 데이터 포트는 Arguments = 4).

참고: 송신자(sender)와 수신자(receiver) 유닛은 동일한 수의 인수를 가져야 한다. 또한 이벤트를 트리거할 때는 값을 사용하지 않더라도 인수와 연관된 값이 있어야 한다. 데이터 포트를 통한 모든 인수는 다른 유닛에 연결되어야 한다. 그렇지 않으면 오류 메시지를 수신하게 된다.

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-creating-custom-event-unit.html

'VS 유닛' 카테고리의 다른 글

변수 유닛  (0) 2021.08.27
Custom Visual Script Event 유닛 만들기  (0) 2021.08.26
Events unit  (0) 2021.08.25
Time Units  (1) 2021.08.24
Control units  (0) 2021.08.24

스크립팅 유닛은 Events를 수신한다. Events 유닛은 모든 스크립트의 시작점이며 그래프에서 특별히 녹색 유닛으로 제공되고 있다.

매우 다양한 Events 유닛이 있는데, 이는 최상위의 Event 카테고리를 선택하면 하위 카테고리들이 그룹핑되어져 있다(퍼지 파인더 > Events):

uzzy Finder > Events

가장 기본이 되는 두 개의 Events로는 Start Event와 Update Event가 있다. 둘 다 Lifecycle에 들어 있다.

  • Start : 그래프(graph)나 이벤트 핸들러(evnet handler)가 최초 생성될 때 한 번 호출된다.
  • Update : 그래프(graph)나 이벤트 핸들러(event handler)가 실행중일 때 매 프레임마다 된다.

새로운 스크립트 머신(Script Machine)은 기본적으로 이러한 두 이벤트를 가지고 생성된다.

Inputs & Outpus

모든 Events에는 자신이 트리거 됐을 때 시작할 스크립트가 연결되는 1개의 트리거 제어 출력 포트가 있다. 

값(Value) Input은 이벤트가 트리거될 때 영향을 줄 수 있는데 이는 옵션 사항이다. 예를 들어, 어떤 이벤트는 어떤 오브젝트가 그 이벤트를 수신할 지를 결정하는 타겟 세팅(Target setting)을 갖는 경우가 있다. 대부분은 기본값으로 This가 설정되어져 있다. 

Events에서 출력되는 값들은 그 Events를 통과하는 인자들이다. 즉, 실제로 발생된 무엇인가 대한 더 많은 정보를 제공한다. 예를 들면, On Trigger Enter Event는 그 충돌에 관여된 다른 Collider 정보를 제공한다.

 

Custom Events(사용자 지정 이벤트)

특수한 타입의 Event로 Custom Evnet가 있다. 이는 다른 그래프에서 Custom Event를 발동시킬 수 있도록 하는 커스텀 인자를 가지고 있다.

예를 들어, On Damage이라는 Custom Event를 만들어서 캐릭터의 HP를 깎는 기능을 구현하고자 한다. 따라서 그 Event는 손상의 정도를 나타내는 정수(integer) 인자(argument)를 가지고 있어야 한다. 이는 Custom Event 유닛을 생성하고 On Damage라는 이름을 부여하면 된다. 그리고 인자 수량(argument count, 아래 이미지에는 0이라고 되어 있음)을 1로 바꾸면 된다.

Custom Events

참고: Index는 zero-based이기(0부터 시작하기) 때문에, 첫 번째 인자(1을 입력하면)는 Arg. 0이라고 명칭이 붙는다.

 

다른 곳에서 이 Event를 트리거하려면 퍼지 파인더의 Trigger Custom Event 유닛을 사용하면 된다. 그 Event 이름은 대/소문자와 띄어 쓰기까지 정확히 똑같게 입력해야 한다.

예를 들어 Player에게 물리적인 충돌을 가하는 바위 기능을 하는 스크립트 머신(Script Machine)인 아래 그래프는 그 충력의 힘을 Damage 값으로 사용하고 있다.

참고: 바위와 부딪힌 Collider(충돌체)는 trigger의 대상이 된다. 즉, On Damage evnet는 그 Collider에 연계된 모든 머신(Machines)을 발동시킨다. Damage 손상은 해당 이벤트를 수신한 오브젝트의 HP에서 그 Damage 값을 빼면 된다.

사용자 정의 이벤트는 수신기(receiver)를 요구하지 않으며, 이를 다루는 수신자(Listener)가 없어도 에러가 생기지 않는다.

 

Animation Events(애니메이션 이벤트)

애니메이션 내에서 어떤 포인트에 도달했을 때 비주얼 스크립트를 발동시키고자 한다면 Animation Events를 이용하면 된다. 머신(machine)과 애니메이터(animator)가 있는 오브젝트를 선택한다. 그리고 그 애니메이션 윈도우에서 Animation Event를 추가한다.

해당 이벤트가 선택된 상태에서 인스펙터(Inspector)에 있는 함수 중 TriggerAnimationEvent를 선택한다.

인스펙터상에 있는 패러미터(parameter)를 조정한다.

비주을 스크립트에 Animation Event 유닛을 추가한다(Events > Animation).

이벤트에는 두 가지 타입이 있다.

  • global animation event
  • named animtion event

두 가지의 차이점은 첫 번째 타입은 오브젝트에 있는 모든 애니메이션 이벤트를 받아 들이고 string 매개변수를 반환한다. 두 번째 타입의 트리거는 명시된 이름의 입력과 동일한 string 매개변수가 된다.

 

Unity Events(유니티 이벤트)

인스펙터(Inspector)에 설정된 이벤트들을 트리거하기 위해서는 Unity Events를 이용하면 된다. 이는 버튼(buttons)과 같은 GUI 컴포넌트들에 많이 있긴 하지만, 사용자 지정 스크립트로 생성할 수도 있다.

머신(machine)이 있는 오브젝트를 선택하여 설정하고 Trigger Unity Event 메소드를 선택한다. String 필드에 그래프에서 수신할 이벤트 이름을 입력하고, 그 그래프에 이름과 매칭되는 UnityEvent 유닛을 추가한다.

 

시스템이 있는 개체를 선택하여 이러한 개체를 구성하고 트리거 Unity 이벤트 방법을 선택하십시오. 문자열 필드에 수신할 이벤트 이름을 그래프에 입력하고 그래프에 일치하는 이름으로 UnityEvent 장치를 추가하십시오.

인수(arguments) 추가는 Unity 이벤트에서는 지원하지 않는다.

 

Events API

비주얼 스크립팅은 C# 스크립트에서 Trigger Custom Events를 사용할 수 있도록 간단한 API를 제공하고 있다.

 

Usings API

다음을 C# 스크립트에 추가하여 API에 엑세스한다.

using Unity.VisualScripting;

 

Triggering API

하나의 메소드(method)가 사용자 지정 이벤트를 트리거할 때 필요하다. 그리고 필요한 여러 개의 인수를 전달한다.

CustomEvent.Trigger(targetGameObject, argument1, argument2, ...)

다음은 사용자 지정 이벤트 유닛의 예이다:

아래 코드에서 트리거된다.

CustomEvent.Trigger(enemy, "Damage"30);

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-events-reference.html

'VS 유닛' 카테고리의 다른 글

Custom Visual Script Event 유닛 만들기  (0) 2021.08.26
Custom Event 유닛 만들기  (0) 2021.08.26
Time Units  (1) 2021.08.24
Control units  (0) 2021.08.24
This unit  (0) 2021.08.24

Time 유닛에는 Timer, Cooldown, Wait 유닛들이 있다.

Wait

Wait 유닛은 스크립트 실행을 지연(delay)시킨다. 지연(delay)은 정해진 시간(초)이 될 수도 있고 계속 진행하기 전에 이행해야 하는 조건이 될 수도 있다.

 

Unity의 비동기성(실행이 지연되는 기능 또는 동작)은 코루틴(coroutine)으로 처리하고 있다(멀티쓰레드 방식이 아니다). Wait 유닛을 사용하려면 코루틴처럼 스크립트가 동작해야 한다고 비주얼 스크립팅에 알려야 한다. 그 방법은 스크립트를 시작시키는 초기 이벤트의 Coroutine 체크박스에 체크해 주면 된다. 그래프 인스펙트에는 다음과 같이 보인다.

이벤트 유닛에 작은 이중 화살표 아이콘이 나타나 코루틴으로 실행되고 있음을 알려준다.

coroutine 확인란이 활성화되지 않은 경우, 런타임시에 발생하는 에러는 포트가 Wait 유닛에 도달할 때만 '코루틴에서 트리거될 수 있음'을 나타내는 것이다.

 

모든 Wait 유닛은 루프(loops)와 시퀀스(sequences) 내부에서도 사용가능하다.

 

Wait For Seconds

Wait For Seconds 유닛은 가장 단순하고 가장 자주 사용되는 Wait 유닛이다. 이 유닛은 실행을 일정 시간(초) 단위로 지연시킨다. (역자주-아래 예시는 마우스 클릭시 5초후에 "Waited!"라는 메시지가 콘솔에 출력된다.)

Wait Until

Wait Until 유닛은 주어진 조건이 충족될 때까지 실행을 멈추게 한다. 아래 예시는 A < 1 조건이 될 때까지 "Close enough"는 콘솔에 출력되지 않는다. 즉, A < 1 인 상태가 되는 순간 출력이 된다.

Wait While

Wait While 유닛은 Wait Until 유닛과 정반대이다. 즉, 주어진 조건이 충족되는 한 실행을 멈추고 있다. 아래 예시는 A > 1인 조건인 동안 콘솔에 "Close enough"이 출력되지 않는다. 즉, A > 1이 아닌 상태가 되는 순간 출력이 된다.

 

Wait For Frame

이름이 의미하듯이 Wait For End Of Frame 유닛과 Wait For Next Frame 유닛은 Unity의 업데이트 루프의 특정 지점이 충족될 때까지 실행을 지연시킨다. 자세한 내용은 Execution Order of Events를 참조하면 된다.

Wait For Flow

Wait For Flow 유닛은 모든 입력 스크립트들이 최소한 한 번은 모두 처리 될 때까지 실행을 지연시킨다. 여러 Events 또는 Frames에 걸쳐 발생하는 조건들을 그룹화하는데 매우 유용한 방법이다. 다른 프로그래밍 언어에서는 이 개념을 "Promises(약속들)"이라고 부르기도 한다.

Wait For Flow

 

Cooldown

Cooldown 유닛은 입력 스크립트가 제한된 횟수만 트리거될 수 있는 경우 시간 제한을 줄 수 있다.

Cooldown이 완료되면 입력 스크립트가 Ready 포트로 전송되고 그렇지 않으면 Not Ready 포트로 전송된다.

Duration 포트는 Cooldown이 다시 완료될 때까지 걸리는 시간을 의미한다. Unscaled가 체크되면 시간 척도(time scale)를 무시하게 된다.

Tick 포트는 Cooldown이 활성화된 상태일 때 매 프레임마다 호출된다. 어떤 액션(Action)이 다시 호출될 수 있을 때까지 남은 시간을 업데이트해서 표시하는 GUI 코드를 작성할 때 유용하다. 이를 위한 두 가지 옵션이 있다.

  • Remaining : Ready가 될때까지의 시간(초)을 반환한다.
  • Remaining % : Ready에서 Not Ready까지의 구간에 대응되는 0과 1사이의 값을 반환한다. 

Cooldown이 Ready가 되자마다 Completed 포트가 작동된다. 이 포트가 트리거되도록 입력 스크립트를 지속적으로 전달할 필요는 없다.

끝으로 Cooldown을 강제로 Ready 시킬 수도 있고, Reset port를 트리거하여 내부 타이머를 재설정할 수도 있다.

아래의 예는 Cooldown이 있는 단순한 사격 시스템으로 다음 사격 가능 시간 까지 남은 시간을 비율로 표시해주는 이미지 바와 시간 값을 표시해주는 텍스트가 있는 UI 스크립트 그래프이다.

 

Timer

타이머 유닛은 일시정지가 가능한 프로세스를 구현하거나 모니터하는 유닛이다.

Duration 포트는 Cooldown이 다시 완료될 때까지 걸리는 시간을 의미한다. Unscaled가 체크되면 시간 척도(time scale)를 무시하게 된다.

Timer는 Start 입력이 트리거 될 때 시작되며, 이후에 Started 출력을 트리거한다.

Pause 입력으로 일시 중지 시킬 수 있고, Resume 입력으로 재시작 시킬 수 있다. 또는 Toggle 입력으로 이러한 상태간 전환을 할 수도 있다.

Tick 포트는 타이머가 활성화되어 있는 동안 매 프레임마다 호출된다. 시간 측정을 얻는 방법에는 두 가지 옵션이 있다.

  • Elapsed : 타이머가 시작된 이후의 시간을 반환한다(경과 시간)
  • Remaining : 타이머가 완료될 때까지의 시간을 반환한다(남은 시간).

측정값은 절대 시간(초)값을 얻을 수 있고 또는 0과 1 사이의 비율 값(%)으로 얻을 수도 있다. 이는 Lerp를 작성할 때 유용하다.

Timer가 종료되자 마자 Completed 포트가 트리거된다.

아래 예시는 단순한 자동파괴 시스템인데, 파괴되기 전까지 점진적으로 스프라이트가 붉게 변해간다.

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-time.html

'VS 유닛' 카테고리의 다른 글

Custom Event 유닛 만들기  (0) 2021.08.26
Events unit  (0) 2021.08.25
Control units  (0) 2021.08.24
This unit  (0) 2021.08.24
유닛의 종류  (0) 2021.08.23

제어 유닛은 분기(if 같은), 반복문(loop), 흐름을 병합하는 유닛들이다.

Branching(분기) : If, Swith, Select

분기 유닛(Branching unit)은 값을 기준으로 제어 흐름을 분할한다.

 

If

If 유닛은 부울(Boolean) 조건을 사용한다. 그 조건이 "True"일 때 어떤 작업을 진행하고, "False"일 때 다른 작업을 진행하게 된다.

Swith

enum(열거형), string(문자열) 또는 integer(정수) 값에 따라 분기된다. 이들 유닛들을 Switch unit이라고 한다.

emnu(열거형)을 switch로 사용하려면 열거형 타입을 선택해야 한다. 그러면 분기 출력 포트가 나타난다.

string(문자열) 또는 숫자(number)를 switch로 사용하려면, 그래프 인스펙터에 분기 옵션을 추가해야한다.

유닛의 출력 포트에 분기 옵션에 추가한 사항이 반영된다.

string(문자열)은 선택자(selector)의 대소문자를 무시하도록 선택할 수도 있다.

참고: Default 포트는 기본적으로 추가되어 있다. 만약, 일치하는 입력 선택자가 없을 경우 제어가 Default로 흘러가게 된다. (역자주-프로그래밍의 switch 문에 default와 동일함)

 

Select

Select unit은 Switch unit과 반대다. 선택자의 값에 따라 여러개의 옵션 집합에서 단일 값을 선택하게 된다.

예를 들어 playerNo에 따라 색상을 선택하는 "Select On Integer" 유닛이 있다.

참고: 위의 예에서 예측 디버깅(주황색으로 표시되는 경고)은 Default 포트가 연결되어 있지 않기 때문에 playerNo가 1, 2, 3, 4가 아닐 경우 오류가 생기게 됨을 알려주고 있다.

 

Looping : While Loop, For Each loop, For Loop, Break Loop

루프(Loop)는 계속 진행하기 전에 일정 횟수만큼 로직(logic)을 반복하는 것이다.

반복되는 로직을 루프의 Body라고 한다. 루프가(반복이) 종료되면 Exit 포트가 호출된다.

 

참고: 모든 루프의 Body는 순차적으로 여러 프레임에 걸쳐 호출되는 것이 아니라 한번에 동시에 호출한다. Coroutine(코루틴)은 업데이트 이벤트를 수동적으로 수신해서 처리하는 방식으로 동작하고 있다.

 

While Loop

while loop은 가장 단순한 형태의 루프다. while의 조건이 true인 동안 Body를 반복한다. while조건이 false가 될때 루프가 종료된다.

예를 들어, 다음 그래프는 루프의 결과가 names 변수에 포함되지 않을 때까지(즉, 기존 목록에 없는 새로운 이름이 선택될 때 까지) 새로운 랜덤 name을 생성한다.

경고: 무한 루프(infinite loop)에 빠지지 않도록 주의 해야 한다. 조건이 항상 True가 되면 무한 루프에 빠지게 된다. 루프 Body가 병렬적(parallel)이지 않고 동시적(synchronous)이기 때문에 비주얼 스크립팅에서는 while loop를 많이 이용하게 되지는 않는다.

 

For Each Loop

For Each 문은 컬렉션(collection)의 모든 요소(element)를 반복하게 된다. 현재 루핑 중인 인덱스와 항목을 출력한다.

예를 들어 다음 그래프는 콘솔에 세 개의 메시지를 출력한다.

  • I like cats
  • I like dogs
  • I like birds

루프에서 Dictionary의 key와 value로 접근하고자 한다면, Dictionary 체크박스에 체크하면 된다.

 

For Loop

For 반복문은 숫자로 구성된 반복문이다. start index, end index 그리고 step 세 개의 정수(integer)가 필요하다. 루프의 시작은 첫 번째 index에서 시작한 다음 step의 크기로 증가하면서 마지막 index까지 반복한다. 출력으로 현재 index를 내보낼 수 있다.

예를 들어, 다음 그래프는 step이 2씩 증가하기 때문에 홀수를 건너뛰며 10까지 진행한다. 즉, 출력은 0, 2, 4, 6, 8이다.

For 문은 Get List Item, Count Items 유닛과 결합할 때 매우 유용하다.

 

예를 들어, 콘솔에 "I like {animal}s"라고 출력한다는 면에서 For Each Loop의 예시와 매우 유사하다.

Item을 일일이 하나씩 출력하는 대신 List Index를 기준으로 Item을 출력한다. 따라서 증가 값 Setp(여기서는 2)을 지정함으로써 일부 Item은 제외 시킬 수도 있다. 아래의 그래프는 두 개의 메시지를 출력한다.

  • I like cats
  • I like birds

 

 

Break Loop

루프는 Break Loop 유닛을 사용하여 반복 중간에 종료 시킬 수 있다. 이 유닛이 실행되자마자 루프는 Exit 포트로 이동한다. 

 

예를 들어, 아래 루프는 10까지 세도록 되어 있지만, Index가 5가 되는 순간 Break 유닛이 실행된다. 따라서 출력은 0, 1, 2, 3, 4만 된다.

 

예외 처리(Exception Handling) : Try Catch, Throw

Try Catch

Try Catch 유닛은 발생한 예외(Exceptions)를 처리한다. 일부 코드에 오류기 의심될 경우 게임이 크래시(중단)되는 것을 방지할 수 있다.

Try 분기에서 실행되는 모든 작업은 "Safe(안전함)"으로 간주된다. 그리고 스크립트가 실패할 경우 Catch 분기를 통해 오류를 처리하고 계속 실행된다. Exception 포트는 실패에 대한 정보를 전달하는데, 이 정보를 경고 로그로 출력하는 것이 가장 일반적이다. 

참고: 기본적으로 Try Catch 유닛은 모든 예외를 파악(캐치)할 수 있다. 드롭다운에서 처리할 예외(exception) 유형을 변경하면 된다.

Finally 분기는 선택 사항이다. 연산(혹은 처리)가 성공하든 실패하든 상관 없이 항상 Try 또는 Catch 다음에 호출된다. 이는 보통 쓸모 없어진 리소스를 처분하거나 파괴하는데 이용된다. 리소스를 파괴할 필요가 없다면 이 포트는 사용할 필요가 없다.

 

Throw

Throw 유닛은 흐름을 멈추게 하는 예외(Exception)를 발생 시킨다. 이 예외를 Try Catch로 처리한다.

 

예상치 못한 일이 발생하면 바로 던짐(throwing)으로써 미리 실패를 확인하는 것은 좋은 습관이다. 이는 버그들이 혼재되고 디버그 하기 어려운 예상치 못한 사이드 이펙트를 발생시키는 대신 초기에 버그를 잡을 수 있도록 하는데 도움이 된다.

 

예를 들어 damage가 양수인지를 보장해야 하는데, 음수가 들어 올경우 Throw로 처리하도록 하는 것이다.

Custom 체크박스를 선택을 하면, 단순한 메시지가 아닌 많은 데이터가 포함된 Custom Exception Object를 전달하게 된다. 일반적으로 사용할 일은 거의 없다. 던져진 예외(thrown exception)의 타입은 System.Exception 이다.

 

Toggles(토글) : Toggle Flow, Toggle Value

Toggle 유닛은 전등 스위치와 원리적으로 유사하다. 즉, 스크립트나 값에 따라서 켜지거나 꺼질 수 있다. 문을 비유로 생각한다면 문이 열리거나 닫힌다고 생각하면 된다.

 

Toggle Flow

Toggle Flow 유닛은 제어 흐름의 관문과 같다. 켜지(On)면 흐름이 진행되지만, 꺼지(Off)면 흐름이 멈추게 된다. 예를들어 Space 바를 한 번 누르면 움직이기 시작하고 다시 두르면 멈추는 것이다.

 

로직을 제어하는 입/출력은 여러 가지가 있다. 앞의 Space 바 예시에서 Toggle on/Toggle off를 하는데 같은 이벤트(키 누르기)를 이용하였다. 하지만 On/Off를 대신하는 다른 두 개의 이벤트를 통해서도 Toggle이 가능하다. 

 

출력 포트쪽에 있는 "Is On" 불리언 포트는 현재 toggle 상태가 켜져 있는지, 꺼져 있는지를 전달한다. 제어 출력은 아래 테이블에 따라서 전달된다(triggered).

Port Triggered When
On On인 상태일 때, 어떤 입력에 대한 제어 처리
Off Off인 상태일 때, 어떤 입력에 대한 제어 처리
Turned On On이 된 경우에 대한 제어 처리, 그게 On인데 On이 되었든 Toggle Input이 On이 들어 왔든지 간에
Turned Off Off가 된 경우에 대한 제어 처리, 그게 Off인데 Off가 되었든 Toggle Input이 Off가 들어 왔든지 간에

Toggle Value

Toggle Value 유닛은 ON/OFF 여부에 따라 두 개의 입력 값(On Value 또는 Off Value) 중에 어느 하나의 값을 선택한다. 포트의 작동은 Toggle Flow 유닛과 똑같이 동작한다.

앞의 예시를 다른 방법식으로 구현한다면: Space bar를 눌러스 토글을 통해 오브젝트를 움직이거나 멈추게 한다고 할 때, 이번에는 이동 속도(veloctiy)를 On 일 대는 1, Off 일 때는 0의 값을 전달해서 구현하는 것이다.

 

참고: 토글 포트 간의 흐름을 확인하는 방법은 toolbar에서 relations를 켜면 된다.

Once

Once 유닛은 그 이후의 로직을 오직 한 번만 실행한다. (아래 예시는 First Fram이 1회 출력되고 이후 부터는 Following Frames만 반복 출력 된다.)

Reset 포트를 이용해 재설정할 수도 있다.

 

Cache

Cache 유닛은 값 비싼 연산(계산)을 하고 그 결과를 저장한다. 그리고 이후 다시 필요할 때 재실행하지 않고 바로 재사용할 수 있도록 해준다.

 

예를 들어, 아래와 같이 그래프를 작성하면, Debug.Log가 두 개인데 이를 위해 Formula를 두번 계산하게 된다.

Cache 유닛을 사용함으로써 한 번만 계산하고 결과를 저장한 다음 두 번째 Debug.log에서는 계산 없이 바로 사용하게 된다. 이는 성능 최적화를 해준다.

참고: 중요한 것은 Cache는 현재 흐름의 범위에서만 사용가능하다는 것이다.  Cache 값은 다른 이벤트와는 공유되지 않으며 접근할 수도 없다.

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-control.html

'VS 유닛' 카테고리의 다른 글

Events unit  (0) 2021.08.25
Time Units  (1) 2021.08.24
This unit  (0) 2021.08.24
유닛의 종류  (0) 2021.08.23
Transform.Translate  (0) 2021.07.23

This unit은 해당 그래프가 실행되는 머신(Machine)을 갖고 있는 게임 오브젝트(Game Object)를 반환(Return)한다.

기본적으로 유닛(Units)의 디폴트 타겟은 This이기 때문에 This 유닛을 별도로 명시해서 사용할 필요가 없다. 예를 들어, 이 두 그래프는 동일하다(주> 두 번째 이미지의 Y Angle 값이 0이 아니라 10)

모든 유닛이 인라인 값(Inline Value)을 지원하는 것은 아니다. 기본 값으로 This대신에 None으로 표시되며 아무것도 없는 경우 해당 필드, 예를 들면 GameObject.Destroy 같은 경우 This를 직접 연결해서 명확히 해줘야한다.

게임 오브젝트가 아직 할당되지 않은 경우더라도 그래프 상에서 This unit을 사용해야 한다. This unit은 머신(Machine)에서 사용되는 순간, 런타임 중에 그래프의 소유자(그래프가 있는 게임 오브젝트)를 가르키게 된다.

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-self.html

'VS 유닛' 카테고리의 다른 글

Time Units  (1) 2021.08.24
Control units  (0) 2021.08.24
유닛의 종류  (0) 2021.08.23
Transform.Translate  (0) 2021.07.23
Transform.position & Transform.Translate  (0) 2021.07.23

유닛(Unit)은 비주얼 스크립팅에서 계산을 하는 가장 기본적인 요소다. 유닛은 텍스트로 필요한 정보를 표시하기도 하지만, 인스펙터에서 편집이 될 수도 있다. 유닛을 편집하려면 유닛을 선택하고 인스펙터에서 유닛의 속성(property)을 편집하면 된다.

This unit

"This unit"은 그래프가 있는 머신(Machine) 컴포넌트를 소유한 게임 오브젝트(Game Object)를 리턴한다.

Control units

"Control unit"은 If, Loop 혹은 흐름 합체같은 유닛들이다. (역자주 - 제어 포트를 가지고 있다)

Time units

Time unit은 timer, cooldown 그리고 wait 유닛 등이 있다.

Events(이벤트들)

스크립팅 유닛(Scripting units)은 Evnets를 수신한다. Evnets는 모든 스크립트의 시작점이며 그래프에서 특별히 초록색 유닛으로 표시된다. (역자주 - Start Event, Update Event, On Button Input Event, On Destroy Event 등등)

Variables(변수들)

변수관련 유닛들에는 get, set 그리고 변수 check 유닛 등이 있다.

(역자주 - get : 변수의 값을 가져옴 / set : 변수에 값을 저장함)

Nulls (널)

Null 유닛들은 null (nothing 값)을 다루는 기능을 한다.

Formulas (공식들, 수식들)

Formula는 다중 인수들을 받아서 논리나 수식을 직접적으로 평가하여 결과를 도출한다.

 

 

<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-units-reference.html

'VS 유닛' 카테고리의 다른 글

Time Units  (1) 2021.08.24
Control units  (0) 2021.08.24
This unit  (0) 2021.08.24
Transform.Translate  (0) 2021.07.23
Transform.position & Transform.Translate  (0) 2021.07.23

 Transform.Translate에 대해 알아보겠습니다.

Transform.Translate

위의 스크립트는 프레임(frame) 마다가 아닌 매초(per second)마다 Y축으로 1씩 이동하라는 의미입니다. 실행해보면 해당 오브젝트가 서서히 상승하는 동작을 확인할 수 있습니다. Per Second를 사용하지 않을 경우 Frame마다 1씩 이동하게 되는데 그렇게 되면 너무 빨라 눈으로 확인하기 어렵게 됩니다.

 

Transform.Translate Units

 

위에 있는 것은 어떤 동작하는 스크립트는 아닙니다. 다양한 형태를 보여드리기 위해 위와 같이 이미지를 구성하였습니다.

Visual Script에서는 Transform.Translate를 다양한 상황에서 쉽게 사용할 수 있도록 옵션처럼 여러 형태의 함수를 제공하고 있습니다.

 

좌측의 3개는 Vector3 좌표를 한 번에 변경할 때 사용하고, 우측의 3개는 X, Y, Z축 각각을 독립적으로 변경할 수 있도록 하고 있습니다.

또한 상대좌표를 World, Self, 그리고 다른 오브젝트를 기준으로 할 수도 있습니다.

 

'VS 유닛' 카테고리의 다른 글

Time Units  (1) 2021.08.24
Control units  (0) 2021.08.24
This unit  (0) 2021.08.24
유닛의 종류  (0) 2021.08.23
Transform.position & Transform.Translate  (0) 2021.07.23

Transform.position(set)과 Transform.Translate의 차이점을 알아 보겠습니다.

차이점을 알아 보기전 아래의 두 스크립트를 살펴봐주세요.

Transform.position & Transform.Translate

 

결론부터 말씀 드리면 위의 두 스크립트는 동일하게 동작합니다.

 

하지만 동작원리는 갖지 않습니다.

Transform.position은 월드의 절대 좌표(혹은 월드 좌표)를 기준으로 동작하고 Transform.Translate는 자기 자신 즉, 로컬 좌표를 기준으로 동작합니다.

 

즉, 위의 스크립트를 설명하자면

1번의 경우  Transform.position(get)으로 현재 자신의 월드 좌표를 가지고 와서 그 월드 좌표에 (0.01, 0, 0)을 더하기 한후 다시 자신의 그 더해진 좌표로 Transform.position(set)해주고 있습니다. Transform.position(set)은 그 좌표로 이동한다는 의미입니다. 이것이 PC 프레임마다 Update되기 때문에 0.01씩 계속 이동하게 됩니다.

 

2번의 경우 절대 좌표는 상관없습니다. 자신(This)의 위치 Transform.Translate에서 매 프레임마다 0.01씩 X축으로 이동하라는 의미입니다.

사용하기 나름이겠지만 보통 비행기가 이동하거나 특정 오브젝트를 따라가거나 할 때(몬스터가 Player 캐릭터를 따라가기)는 Transform.Translate를 사용합니다.

Transform.Translate에 대해 추가적인 설명글이 별도로 있습니다.

'VS 유닛' 카테고리의 다른 글

Time Units  (1) 2021.08.24
Control units  (0) 2021.08.24
This unit  (0) 2021.08.24
유닛의 종류  (0) 2021.08.23
Transform.Translate  (0) 2021.07.23

+ Recent posts