1. 파츠별로 나뉜 메쉬 (사실 각메쉬는 전체 스켈레톤 트리정보를 가지고있음)

 

2. Character Actor BP에서 드래곤볼

 

3. BP에서 Master로 설정한 SKM component의 값, 포인터 호출 공유

 

작동 테스트

 

 

'Unreal > Animation' 카테고리의 다른 글

UE Animation 구조  (0) 2024.05.20
Anim Asset 구조  (0) 2024.05.16

기본 구조

Construction Flow / [F]Create Mesh Section
Procedural mesh node들 / Update Flow

일반적인 그래픽스 기본 도형 생성 과정과 비슷

  1. Create Mesh Section
    1. Target : Procedural Mesh Component ( A )
    2. Section Index : mesh 내 해당 polygon의 index num ( 겹칠경우, 기존 polygon 덮어씌움 )
    3. Vertices : 참조할 vertex array ( 더미 포함되어있어도 상관없음 )
    4. Triangles : vertices(c) 중 이 노드에서 만들 polygon의 edge로 참조할 vertex vector 3개
    5. 추가항목 : vertices의 각 vertex와 매치되어 기능하는 항목들 ( linear interpolation 기반으로 보임, 노랑은 vector(flaot3) array / 파랑은 float2 array )
      1. normal

         

        Normal Map과 동일한 효과

        • vectex단위로 normal vector를 저장한 다음, polygon위의 각 점에 대해, 3개의 edge의 normal값을 Linear interpolation 하여 적용하는 형태로 보임
      2. UV

        UVn ( n은 채널명, 각 material을 원하는 channel에 적용할 수 있음 )

        • 몰라.. float2 array니까 mesh의 n채널 uv맵(정사각형)에서 각 버텍스와 매치시키겠지..
        • uv map 구조static mesh와 할당된 UV map

        • 좌상단 : [0, 0] / 우하단 : [1, 1]
      3. Tangents : 더모름.. polygon 내에서 곡률을 주는건 불가능할꺼고(nurbs나 subdivision처리..? , normal map처럼 mat처리도아닐꺼고 texture stretching?)
  2. Update Mesh Sction
    • polygon 단위로 update
    • node는 create mesh section(1)과 동일
  3. Create StaticMesh
    1. Actor 내 ProcedurealMeshComponent 선택
    2. (1) Procedural Mesh category의 create staticmesh 버튼 클릭
    3. (2) 경로 선택
    4. (3) static mesh 생성됨 ( construction script 내용 기준인걸로 보임 )
  4. 기타 mesh reference

 

 

 

'Unreal > UE Class :: UObject' 카테고리의 다른 글

Subsystem  (0) 2024.05.16
Field  (0) 2024.05.16
기본 구성 리스트  (0) 2024.05.16

구조

 

 

BP 샘플

부모 ( 호출자 ) < - > 자식 ( 반응자 )

 

코드 구성


부모 자식
부모.h 부모(호출).cpp 자식.h 자식(실행).cpp
DECLARE_MULTICAST_DELEGATE([Delegate 클래스명 선언]);
UClass()
{ [Delegate 클래스명]
[Delegate 객체]; }
호출
[Delegate 객체]
.
Broadcast(); ( multi일 경우 )
[Delegate 객체].ExcuteIfBound(); ( single일 경우 )
  [부모class]->[Delegate 객체].AddUObject([자식](타겟 함수를 보유한 class의 객체), &[타겟 함수]);
( multi일 경우 )
( single은 BindUObject // UObject 외에도 TsharedReference, Function 등 존재 )
       

 

BP에서 delegate에 Binding 하기

- static 함수로 BlueprintCallable함수를 만듬 ( delegate를 포함한 class의 생성 함수 )

- dynamic delegate는 BlueprintAssignable로 지정

 

상호참조 ( circular dependency )

  1. 문제 : Header 파일은 상호참조가 불가능함 
  2. 예시
    1. A.h : # include B.h
    2. B.h : # include A.h

  3. 방법
    1. 한쪽에서는 소스파일에서 include
    2. 예시
      1. A.h : # include B.h
      2. B.cpp : # include A.h

 

 

전방선언 ( forward declaration )

  1. 문제 : 함수가 상호참조할 경우
    1. 같은 파일 내의 두 함수 중 하나는 상대방을 인식할 수 없음
    2. 다른 파일간의 두 함수 중 하나는 header에서 include를 못하므로, header에서 함수선언시 type을 정의할 수 없음

  2. 예시
    1. 본문의 경우, child.h에서 InitFunction 선언 시 argument로 dispatcherTest를 가질 수 없음

  3. 방법
    1. 동일한 명칭의 가상(더미) 클래스를 만듬
      1. 헤더파일에서만 사용됨
      2. 소스파일에서는 #include가 되어있을 경우, 자동으로 대체되는걸로 보임
      3. DisPatchChild.h - 
        class ADispatcherTest;

 

자신 클래스에 대한 참조 ( Self reference )

  1. 문제
    1. cpp에서 this는 const var* 형태 이므로 다른 class에 reference로 전달 시, 내부에 접근하지 못하는 문제

  2. 예시
    1. this를 통해 얻은 pointer를 그대로 전달 시, 해당 객체가 보유한 [delegate] 객체를 call만 가능하고 bind는 불가능

  3. 해결
    1. const_cast로 const 제거
      1. CustomClass* [var] = const_cast<CustomClass*>(this)

  4. 추가정보
    1. const [Ptr] : 해당 ptr을 통해 내용물의 set 불가
    2. [Ptr] const : 해당 ptr의 참조 대상(메모리 주소) 변경 불가(재할당 불가)
    3. const [Ptr] const 가능

 

샘플 코드

부모.h

더보기
// Fill out your copyright notice in the Description page of Project Settings.
 
#pragma once
 
#include "CoreMinimal.h"
 
#include "Components/BoxComponent.h"
#include "Components/SceneComponent.h"
#include "Components/ArrowComponent.h"
#include "DisPatcherChild.h"
 
#include "GameFramework/Actor.h"
#include "DispatcherTest.generated.h"
 
DECLARE_MULTICAST_DELEGATE(TurnLightDelegate);
 
UCLASS()
class MYPROJECT_API ADispatcherTest final : public AActor
{
    GENERATED_BODY()
     
public:
    // Sets default values for this actor's properties
    ADispatcherTest();
    UPROPERTY(EditAnywhere, blueprintReadWrite, Category = "Dispatcher")
        USceneComponent* RootComp;
    UPROPERTY(EditAnywhere, blueprintReadWrite, Category = "Dispatcher")
        UBoxComponent* BoxComp;
    UPROPERTY(EditAnywhere, blueprintReadWrite, Category = "Dispatcher")
        UArrowComponent* ArrowComp;
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dispatcher")
        UStaticMeshComponent* BoxMesh;
     
protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;
     
public:
    // Called every frame
    virtual void Tick(float DeltaTime) override;
     
    bool bIsOn = false;
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dispatcher")
        TArray<ADisPatcherChild*> MyChildren;
     
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dispatcher")
        int32 ChildCount=5;
 
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dispatcher")
        TSubclassOf<ADisPatcherChild> ChildClass;
 
    UFUNCTION(BlueprintCallable, Category = "Dispatcher")
    void CreateChildActor(int Count, TArray<ADisPatcherChild*>& ChildrenArr) const;
 
    UFUNCTION()
        void OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
            UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep,
            const FHitResult& SweepResult);
     
    TurnLightDelegate TurnLightDelegatePtr; // 1. Declare a delegate pointer
         
};

 

부모.cpp

더보기
// Fill out your copyright notice in the Description page of Project Settings.
 
 
#include "DispatcherTest.h"
 
#include "ActorReferencesUtils.h"
 
 
// Sets default values
ADispatcherTest::ADispatcherTest()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;
 
    RootComp = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
    RootComponent = RootComp;
    BoxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxComp"));
    BoxComp->SetupAttachment(RootComponent);
    BoxComp->SetRelativeScale3D(FVector(2, 2, 2));
    ArrowComp = CreateDefaultSubobject<UArrowComponent>(TEXT("ArrowComp"));
    ArrowComp->SetRelativeRotation(FRotator(0, 90, 0));
    ArrowComp->SetupAttachment(RootComponent);
    BoxMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BoxMesh"));
    BoxMesh->SetRelativeScale3D(FVector(0.64, 0.64, 0.64));
    BoxMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
    BoxMesh->SetupAttachment(BoxComp);
 
    BoxComp->OnComponentBeginOverlap.AddDynamic(this, &ADispatcherTest::OnOverlapBegin);
}
 
// Called when the game starts or when spawned
void ADispatcherTest::BeginPlay()
{
    Super::BeginPlay();
 
    CreateChildActor(ChildCount, MyChildren);  
}
 
// Called every frame
void ADispatcherTest::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
 
}
 
void ADispatcherTest::CreateChildActor(const int Count, TArray<ADisPatcherChild*>& ChildrenArr) const
{
    for (int i = 0; i <= Count; i++)
    {
        FVector TargetLoc = GetActorLocation() + FVector(0, 100*i, 0);
        TargetLoc -= this->GetActorLocation();
        TargetLoc = FRotationMatrix(RootComponent->GetComponentTransform().Rotator()).TransformPosition(TargetLoc);
        TargetLoc += this->GetActorLocation();
 
         
        AActor* TempChild;
        TempChild = GetWorld()->SpawnActorDeferred<AActor>(ChildClass, FTransform(TargetLoc), nullptr, nullptr, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
        TempChild->FinishSpawning(FTransform(TargetLoc));
 
        if (ADisPatcherChild* Child = Cast<ADisPatcherChild>(TempChild))
        {
            ADispatcherTest* SelfRef = const_cast<ADispatcherTest*>(this);
            Child->InitFunction( SelfRef );
            ChildrenArr.Add(Child);
        }
         
         
    }
    //ParentActor->TurnLightDelegatePtr.BindSP(this, &ADisPatcherChild::TurnLight);
}
 
 
void ADispatcherTest::OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
    UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
    UE_LOG(LogTemp, Log, TEXT("Overlap Begin"));
    TurnLightDelegatePtr.Broadcast();
    //TurnLightDelegatePtr.ExecuteIfBound();

 

 

자식.h

더보기
// Fill out your copyright notice in the Description page of Project Settings.
 
#pragma once
 
#include "CoreMinimal.h"
 
//#include "DispatcherTest.h"
#include "Components/ArrowComponent.h"
#include "Components/SphereComponent.h"
#include "Components/SceneComponent.h"
#include "Components/StaticMeshComponent.h"
#include "Components/PointLightComponent.h"
 
#include "GameFramework/Actor.h"
#include "DisPatcherChild.generated.h"
 
class ADispatcherTest;
 
UCLASS()
class MYPROJECT_API ADisPatcherChild : public AActor
{
    GENERATED_BODY()
     
public:
    // Sets default values for this actor's properties
    ADisPatcherChild();
 
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dispatcher")
        USceneComponent* RootComp;
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dispatcher")
        USphereComponent* SphereComp;
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dispatcher")
        UStaticMeshComponent* SphereMesh;
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dispatcher")
        UPointLightComponent* PointLightComp;
 
    bool bIsOn = false;
protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;
 
public:
    // Called every frame
    virtual void Tick(float DeltaTime) override;
     
     
    UFUNCTION(BlueprintCallable, Category = "Dispatcher")
        void TurnLight();
     
    void InitFunction(ADispatcherTest* ParentActor);
     
};

자식.cpp

더보기
// Fill out your copyright notice in the Description page of Project Settings.
 
#include "DisPatcherChild.h"
 
#include "DispatcherTest.h"
 
 
 
 
// Sets default values
ADisPatcherChild::ADisPatcherChild()
{
     
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;
 
    RootComp = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
    RootComponent = RootComp;
     
    SphereComp = CreateDefaultSubobject<USphereComponent>(TEXT("sphereComp"));
    SphereComp->SetupAttachment(RootComponent);
 
    SphereMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("SphereMesh"));
    SphereMesh->SetRelativeLocation(FVector(0, 0, 0));
    SphereMesh->SetRelativeScale3D(FVector(0.5, 0.5, 0.5));
    SphereMesh->SetupAttachment(SphereComp);
    //SphereMesh->SetStaticMesh(ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Engine/BasicShapes/Sphere.Sphere'")).Object);
 
    PointLightComp = CreateDefaultSubobject<UPointLightComponent>(TEXT("PointLightComp"));
    PointLightComp->SetRelativeLocation(FVector(0, 0, 100));
    PointLightComp->SetupAttachment(RootComponent);
    PointLightComp->SetIntensity(1000);
     
}
 
// Called when the game starts or when spawned
void ADisPatcherChild::BeginPlay()
{
    Super::BeginPlay();
     
}
 
// Called every frame
void ADisPatcherChild::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
 
}
 
void ADisPatcherChild::TurnLight()
{
     
    if (bIsOn == false) // 불켜기
    {
        UE_LOG(LogTemp, Log, TEXT("TurnOn"));
        PointLightComp->SetIntensity(100000);
        bIsOn = true;
    }
    else// if (bIsOn == true) // 불끄기
    {
        UE_LOG(LogTemp, Log, TEXT("TurnOff"));
        PointLightComp->SetIntensity(1000);
        bIsOn = false;
    }
}
 
void ADisPatcherChild::InitFunction(ADispatcherTest* ParentActor)
{
    ADispatcherTest* ParentIns = Cast<ADispatcherTest>(ParentActor);
    UE_LOG(LogTemp, Log, TEXT("Initted Child"));
     
    //ParentIns->TurnLightDelegatePtr.BindUObject( this , &ADisPatcherChild::TurnLight);
    //ParentIns->TurnLightDelegatePtr.BindUFunction(this, FName("TurnLight"));
    ParentIns->TurnLightDelegatePtr.AddUObject(this, &ADisPatcherChild::TurnLight);
    //ParentIns->TurnLightDelegatePtr.BindUObject(this, &ADisPatcherChild::TurnLight);
     
}

'Unreal > BP & UE Library' 카테고리의 다른 글

Class Name 접두  (0) 2024.05.17
code 내장 함수  (0) 2024.05.17
BP Interface  (0) 2024.05.16
BP node list 1  (0) 2024.05.16
BP Node 리스트  (0) 2024.05.16

Animation Blueprint

  • AnimGraph
    • States Machins ( Locomotion )
      • State
        • FBX(몽타주) 혹은 Blend Space와 연결
      • Transition
        • Transition rule을 포함

몽타주

  • Animation
    • Skeleton
  • VFX
  • SFX
  • Notifier
    • Anim Notify
    • Notify Detail
      • Sound : SFX 파일
      • Event
        • Trigger weight threshold : 중첩 시 발동제한강도
        • Montage Tick Type
          • Queued : 중첩시 밀릴 수 있음
          • Branched : 중첩시 정상 동작
      • Attached ( particle, bool ) : 이펙트의 캐릭터종속vs월드종속(transform) 여부 결정
      • Socket : 적용 위치 ( skeleton Tree에서 확인 )
    • New Notifier : 외부 이벤트의 AnimNotify_이름의 event trigger 발동 (디스패쳐)

 

Blend Space

  • Animation 들의 혼합 ( 수치기반 혼합 )
  • SK
    • Bones ( hierachy )
      • Name
      • Transform ( Location / Rotation / Scale )
      • float variable
        •  
        • time-bone weight(0~1), bone-bone weight(transform)(1~10), mask(alpha?)(0~1) 값 등 제어하기 위한 듯
    • Virtual Bones : 몰?루 _ IK, retargetting 등 동적으로 구조 혹은 관계 변화/계산 필요할때 참조하기 위한?
      •  
    • Sockets
      • 다른 mesh 혹은 BP에서 접근하기 위한 bone hierachy내의 local transform 값?
  • SKM
    • Bones ( hierachy )
      • name
      • weight ( skin )
        • SK
          • Bones ( hierachy )
            • Name
            • Transform ( Location / Rotation / Scale )
            • float variable
              • time-bone weight(0~1), bone-bone weight(transform)(1~10), mask(alpha?)(0~1) 값 등 제어하기 위한 듯
          • Virtual Bones : 몰?루 _ IK, retargetting 등 동적으로 구조 혹은 관계 변화/계산 필요할때 참조하기 위한?
          • Sockets
            • 다른 mesh 혹은 BP에서 접근하기 위한 bone hierachy내의 local transform 값?
        • SKM
          • Bones ( hierachy )
            • name
            • weight ( skin )

관계도

'Unreal > Animation' 카테고리의 다른 글

UE Animation 구조  (0) 2024.05.20
Skeletal Mesh 모듈화 기능 ( Set Leader Pose Component )  (0) 2024.05.16

Space

  • Loacation
    • Actor Location ( get / set )

Physics

 

Logic

  • Input : 해당 blue print의 "Input" action node 활성화 여부
    • Enable input
      • target : 활성화 할 블루프린트
      • Player controller : 활성화할 플레이어 ( get player controller0 = 자신 )
    • Disable input
  • Array
    • set array elem (element) : array [ index ] = item ( input size to fit : allocate? )
  • Branch : if ( bool )
  • Sequence 순차실행
  • EventDispatcher : Inter BluePrint Call/Back 기능
    • Call EventDispatcher :
      • input : vars ( eventDispatcher의 설정에 따라 type/갯수 변경 )
    • Bind EventDispatcher : input
      • Call event dispatcher를 가진 class(component) ( type은 EventDispatcher가 포함된 )
      • Call 시 반응할 Event node
    • Custom Event
      • input 된 값을 받을 vars
  • Damage
    • apply damgage
  • Make Literal Name
    • AI-BB등 외부 변수를 이름으로 가져오기
  • Is valid : 해당 변수가 null or Err 인지 체크

 

AI

  • AI navigation
    • Move
      • simple move to location : location(var)로 controller(var)를 이동 (nav mesh 기반)
  • Controller
  • Pawn
    • Get Controlled Pawn : 현재(var) AI controller에 의해 제어되는 pawn들 return
    • Get controller : 해당 Pawn의 Controller component
  • Behavior Tree
    • Run Behavior tree : AI controller에서 behavior tree를 호출
    • BTTask_BlueprintBase : Behavior tree에서 task로 호출할 수 있는 logic의 blueprint
      • event receive execute AI : AI task로 호출당할 시 수행
      • Finish execute : task 종료를 알림. 상위 BT에서 다음 task로 넘어갈것 전달
    • Sequence : 순차실행. fail이 나올떄까지 실행. 하나라도 성공시 success 반환
    • Selector : 선택실행. true 나올때까지 실행, 하나라도 실패시 fail 반환
  • BlackBaord
    • (get/set) blackboard value as (type) : BTT(behavior tree task)의 블루프린트에서 black board 변수에 접근 ( var type = blackboard key selector ) → BT (behavior tree) 에서 match시켜줘야 함
    • (get/set) value as (type) : BTT/S/D가 아닌 AI controller에서는 blackboard 없이 그냥 value 함수를 사용 / 1. BB를 받고, 2. 변수명을 받아서, 3. 값을 입력(set)

Relation

  • Get
    • user widget object : 사용자지정 widget 블루프린트
    • controlled pawn (BP AI controller용) : 해당(기본 self) AI controller를 사용하는 BP Charactor
    • controller : pawn의 nav 관리 속성

Calculation

 

Common property

  • visibility : rendering 여부 ( input "renderable obj" / visibility(bool) / propagate to children(bool)-자식들에게 적용 여부
    • set visibility
    • is visible
  • Remove : actor 제거
    • remove from parents ( input "actor" )
  • player controller
    • player's control asignment ( multi_ player 0 == self )
    • get player controller ( var = int ( 멀티플레이시 플레이어 num. 자신 == 0 )
  • Cast to ~ : 형변환. 해당 type 속성을 뽑아내어 사용할 수 있는 형태로 전환
    • cast to 사용자지정
  • Spawn
    • spawn emitter at location
    • spawn actor from class
  • distroy
    • distroyActor

 

UI ( MGU / Canvas )

  • Add to viewport : 화면에 출력 ( input "Widget Object"(UI/MGU) )
  • mouse cursor : 마우스 커서 관련 숨김 등
    • Set show mouse cursor ( input "플레이어 컨트롤러" )
    • Set input mode Game / UI : UI만 조작가능 상태로 전환 / 기타 등등
  • Create
    • create widget : UI bp 생성

Console

  • print text : 콘솔에 text 출력 ( input "text" )
  • print string : 콘솔에 string 출력 ( input "string" )
 



'Unreal > BP & UE Library' 카테고리의 다른 글

Class Name 접두  (0) 2024.05.17
code 내장 함수  (0) 2024.05.17
BP Interface  (0) 2024.05.16
BP node list 1  (0) 2024.05.16
UE Dispatch & Delegate  (0) 2024.05.16

Main Screen UI

 

Command List

  • Main screen
    • esc ( in play ) : play 상태 종료
  • View port
    • v + (기타 키) ( gizmo ) : vertex snapping
    • Alt + P : View port에서 현재 레벨 play
    • Alt + g, h, j, k : view port 시점 전환
    • Alt + L : Landscape toggle
    • P : bake된 nav mesh 시각화
    • F : 선택된 Actor로 cam 이동 ( location, rotation, scale 감안 )
    • 플레이 중
      • ' (작은 따옴표) : 디버그 창
        • 숫자키패드 4 : AI perception 시각화
      • F8 : baked nav mesh 표기 및 마우스 보이는 상태로 전환
    • Shift 1~8 : 작업모드 전환 ( 1 : select / 5 : modeling )
    • L + click : 라이트 배치
    • ctrl + L : Sun 위치 확인?
    • ctrl + B : 선택된 엑터 - contents browser에서 표기
    • alt + wheel ( gizmo ) : 피벗 이동
    • ctrl + alt + drag : 범위 내 액터선택 ( 원근뷰 )
  • Blue Print
    • BluePrint
      • S + click : Sequence - 순차시행 ( 모듈화된 작업 시각화 )
      • Alt + 클릭 ( 와이어 ) : 와이어 제거
    • Material
      • num + click : num 갯수만큼의 차원(float x dimension)을 가진 변수 생성 ( ex. RGB - 3차원 )

https://blog.naver.com/PostView.naver?blogId=happynewmind&logNo=221562652852

'Unreal > Editor Interface' 카테고리의 다른 글

Commands  (0) 2024.05.16

횡스크롤 슈팅 게임

 

움직임

  • 죄다 움직임 처리 ( 디즈니 애니메이션 풍 _ 과장된/지속적인 움직임 )
  • 로딩화면 모래시계마저..

 

코어

  • 하드코어
    • 학습
    • 실패에 대한 피드백
    • 재시도 동기 부여
  • 미니게임 모음
    • 유사성
      • 조작
    • 차이성

 

조작특징

  • 일반모드
    • 키 : shift zxcv tap 방향키
    • 오른손 - 방향키 / 왼손 zxcv ( tap은 가끔 ) : 좁은 손가락 이동범위
  • 전투기모드

 

  • 기술 커스터마이징

 

그래픽특징

  • 카툰 풍(디즈니)
  • 외곽선

감성

 

UI 특징

  • HP : 남은 피격기회
  • 카드 : 필살기(v) 코스트
  • 전투가 완전히 세션화되어, 전투세션에선 필요한 UI만 띄움

  • 상호작용 가능 시 - 상호작용 버튼이 머리위에 뜸 ( z )
  • 상호작용 대상은 Obj인데, 버튼입력은 캐릭터 머리위에 뜸

 

 

보스 패턴 규칙

  • 빠른공격
    • 공격 전 움직임 정지
      • 통상상태에서는 항상 움직임이 있음

 

실패 연출

  • 진행도 표시
  • 페이즈에 대한 직관 부여 ( 실패 시 ) → 학습강화

성공 연출

  • npc에게 대화걸 경우, "말하는 사람"에게 화면 중심이 lerp하게 이동

  • 단일 플로우의 대화 안에서도 캐릭터의 애니메이션과(Idle상태 반복애니메이션. 별도애님은 아님), 말풍선의 크기, 위치변화, 말풍선 꼬리 변화하여 역동감

영화관모드인데, 캐릭터는 프레임을 뚫고나오네 - 배경과 캐릭터를 분리 → 정적인 배경과 동적인 캐릭터를 더 강하게 대비시킴

https://youtu.be/19AVUPoYLr0

인터랙션 가능한 대상 ( 입장가능한 건물, 확인가능한 오브젝트, NPC )는 모두 움직임 혹은 떨림효과를 가짐 - 움직임 기반 구분

 

'inspiration > Game Play Record' 카테고리의 다른 글

Carto  (0) 2024.05.16
보드 게임  (0) 2024.05.16

+ Recent posts