내가 구현하면서 실수한게

블루프린트에서 사용하던 ScreenX, Y는

C++에서 써야되서

 

C++에서 먼저 만들어서 가져와써야됫다.

근데 생각못하고 BP에 만들어서 사용

 

그래서 기존 ScreenX, ScreenY앞에 BP_를 붙여 이름을 구분하고

 

 

CameraPawn 헤더에 따로변수추가

윈API 쓸것이므로 

헤더 추가

커서 이동, 클릭을 위한 함수도 추가.

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "Windows/AllowWindowsPlatformTypes.h"
#include <Windows.h>
#include "Windows/HideWindowsPlatformTypes.h"


#include <GameFramework/SpringArmComponent.h>
#include <Camera/CameraComponent.h>

#include "Components/PoseableMeshComponent.h"

#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "CameraPawn.generated.h"

UCLASS()
class HANDDESKTOP_API ACameraPawn : public APawn
{
	GENERATED_BODY()

public:
	// Sets default values for this pawn's properties
	ACameraPawn();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
	
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PoseableMesh)
	UPoseableMeshComponent* HandRight;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PoseableMesh)
	UPoseableMeshComponent* HandLeft;


	UPROPERTY(VisibleAnywhere, Category = Camera)
	class USpringArmComponent* springArmComp;

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)
	class UCameraComponent* camComp;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = ScreenCoord)
	int ScreenX = 0;
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = ScreenCoord)
	int ScreenY = 0;

	UFUNCTION(BlueprintCallable, Category=MouseControl)
	void MouseMove();
	UFUNCTION(BlueprintCallable, Category = MouseControl)
	void MouseClick(int status);

};

 

마우스 무브 구현

void ACameraPawn::MouseMove()
{
	SetCursorPos(ScreenX, ScreenY);
}

 

 

 

 

BP스크린xY계산과 커서 이동 중간에

ScreenXY 설정, 마우스 무브도 추가

 

 

 

마우스 커서 이동 확인

 

마지막으로 마우스 클릭 구현 차례인데

 

 

일단 3이하받으면 마우스 이벤트 수행

아니면 안하고

void ACameraPawn::MouseClick(int status)
{
	INPUT input = { 0 };
	input.type = INPUT_MOUSE;

	if (status == 0)
		input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
	else if(status == 1)
		input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
	else if(status == 2)
		input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
	else if(status == 3)
		input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
	
	if (status <= 3)
		SendInput(1, &input, sizeof(INPUT));
}

 

 

 

 

 

마우스 클릭 이벤트 처리 시점을 생각해봤는데

커서 이동 체크 루틴에서

 

1. 커서 이동 체크시 아닐 겨우 확인 직후 바로

2. 커서 이동 체크시 이동하는 경우 ScreenXY 설정, 마우스 이동이후 바로

다뤄야 할듯

 

 

 

좌클릭의 경우 오른손 검지 중지 붙였을때

우클릭의경우 오른손 약지 소지를 접었을때로 처리

 

상태 다루기위한 ClickStatus, ClickStatusPrev int타입으로 추가

위 C++코드대로

0 : 좌마우스 다운

1 : 좌마우스 업

2 : 우마우스 다운

3 : 우마우스 업

4 : None

으로 5가지로 다룸

 

 

우선 좌클릭은 커서 이동여부 체크때 썻던 내용 활용

해서 하려고하는데

손 겹침과 마우스 입력 경우가 섞여있어서 햇갈린다.

 

나눠서 다시정리하자

 

 

손가락붙임상태

0 검지중지붙음

1 약지소지접힘

2 아무것도 안됨(디폴트)

 

마우스입력상태

0 : 좌마우스 다운

1 : 좌마우스 업

2 : 우마우스 다운

3 : 우마우스 업

4 : None(디폴트)

 

 

손가락붙임상태의 경우 이전, 현재를 따로 놓고 구분하자

 

이전 현재 값이 동일한 경우 4로 mouseClick함수 호출해서

SendInput을 안보내려고하는데

좌마우스 다운상태에서 SendInput시 드래그가 되는건진 모르겟다.

손가락붙임상태_이전 손가락붙임상태_현재 마우스입력상태
2(안붙음) 0(검지중지붙음) 0(좌마우스다운)
0(검지중지붙음) 2(안붙음) 1(좌마우스업)
2(안붙음) 1(약지소지접힘) 2(우마우스 다운)
1(약지소지접힘) 2(안붙음) 3(우마우스 업)
이전 현재 동일한경우 이전 현재 동일한경우 4(None)

 

이를 위해 마우스 스테이터스 변수 추가

 

 

 

 

 

오른손을보고 손가락붙임 상태 보는 BP

0, 1, 2 구분할수 있도록 만들었다.

 

 

 

 

 

 

 

 

그리고 이 표대로 작성 후

마우스 클릭 호출 하는 블루프린트

 

마우스 클릭 동작은 편의를 위해서 커서 움직이지 않는 경우에만 진입

손가락붙임상태_이전 손가락붙임상태_현재 마우스입력상태
2(안붙음) 0(검지중지붙음) 0(좌마우스다운)
0(검지중지붙음) 2(안붙음) 1(좌마우스업)
2(안붙음) 1(약지소지접힘) 2(우마우스 다운)
1(약지소지접힘) 2(안붙음) 3(우마우스 업)
이전 현재 동일한경우 이전 현재 동일한경우 4(None)

 

 

 

 

 

 

 

결과 영상

 

+ Recent posts