viewimage.php?id=2abcdd23dad63db0&no=29bcc427b28277a16fb3dab004c86b6fc58f455ca050d53987cdf316138e58cb696767ebeb216c8821e423e65e88c5b363c241ba4e96203e4eb6




์•ˆ๋‡ฝ, ์š”์ฆ˜๋„ ๋„ํŠธ ์ˆ˜๋ฐฑ๋ฒˆ์”ฉ ์ฐ์—ˆ๋‹ค๊ฐ€ ์ง€์› ๋‹ค๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ž˜ ์•ˆ ์ฐํžˆ๋Š” ๋ชจ์…˜์ด ์žˆ์–ด์„œ ์˜ค๋Š˜์€ ์ฝ”๋“œ ๊ด€๋ จ ๋กœ์ง์„ ํ•œ๋ฒˆ ๋“ค๊ณ  ์™€๋ดค์Œ.


๋‹น์—ฐํžˆ ์œ ๋‹ˆํ‹ฐ์— ์Šค์™€์ดํ”„ ๋””ํ…์…˜ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ์ค„ ์•Œ์•˜๋”๋‹ˆ ํ„ฐ์น˜ ์—… & ๋‹ค์šด ์ฝ”๋“œ๋ฐ–์— ์—†๋”๋ผ๊ณ ?


๊ฐ„๋‹จํ•œ ๋กœ์ง์ด์ง€๋งŒ ์ฒ˜์Œ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋ง‰ํž ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ๊ณต์œ  ๊ฒธ ํ•ด์„œ ๊ฒธ์‚ฌ๊ฒธ์‚ฌ ์˜ฌ๋ ค๋ด„.



-------------------------------


์‚ฌ์‹ค ์Šค์™€์ดํ”„ ๋””ํ…์…˜ ๋กœ์ง ์ž์ฒด๋Š” ๊ฐ„๋‹จํ•จ. ์ธํ’‹ ๋‹ค์šด & ์—… ๊ฐ๊ฐ์˜ ํฌ์ง€์…˜์„ ์ €์žฅํ•ด ๋’€๋‹ค๊ฐ€, ๋ฒกํ„ฐ ๊ณ„์‚ฐํ•ด์„œ ์•„ ์–ด๋А ๋ฐฉํ–ฅ์œผ๋กœ ์Šค์™€์ดํ”„ํ–ˆ๊ตฐ, ์„ ์•Œ์•„๋‚ด๋ฉด ๋จ.


ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์ธํ’‹ up์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„๋„ ์ผ์ • ๊ฑฐ๋ฆฌ ์ด์ƒ์„ ์Šค์™€์ดํ”„ํ•˜๋ฉด ๋””ํ…์…˜๋˜๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์–ด์„œ ์•ฝ๊ฐ„ ๋กœ์ง์„ ๋น„ํ‹€์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Œ.


๊ทธ๋Ÿผ ๋กœ์ง์€ ๋Œ€๊ฐ• ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜๊ฒ ์ง€?



viewimage.php?id=2abcdd23dad63db0&no=29bcc427b28277a16fb3dab004c86b6fc58f455ca050d53987cdf316138e58cb696767ebeb216c8821e423e65e8896e48aa51e3dc1f9f29d7338


์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋  ๊ฑฐ์•ผ

Vector2 touchDownPos;

Vector2 swipeDirection;

void processMobileInput()

ย  ย  ย  ย  ย {

ย  ย  ย  ย  ย  ย  ย  ย  ย if (Input.touches.Length > 0)

ย  ย  ย  ย  ย  ย  ย  ย  ย {

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  Touch t = Input.GetTouch(0);

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  if (t.phase == TouchPhase.Began)

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย //save began touch 2d point

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย touchDownPos = new Vector2(t.position.x, t.position.y);

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  }

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  else if (t.phase == TouchPhase.Moved)

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย Vector2 currentTouchPos = new Vector2(t.position.x, t.position.y);

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย bool swipeDetected = checkSwipe(touchDownPos, currentTouchPos);

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย swipeDirection = (currentTouchPos - touchDownPos).normalized;

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย if (swipeDetected)

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  onSwipeDetected(swipeDirection);

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  }

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  else if (t.phase == TouchPhase.Ended)

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย Debug.Log("Swipe End!");

ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  }

ย  ย  ย  ย  ย  ย  ย  ย  ย }

ย  ย  ย  ย  ย }





TouchPhase.Ended ๊ฒฝ์šฐ์—๋Š” ํ„ฐ์น˜๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์ธ๋ฐ, ์ฆ‰ ์†๊ฐ€๋ฝ์„ ๋—๋‹ค๋Š” ๋ง์ด์ง€๋งŒ Swipe Detected ๋กœ์ง์ด ์—†์Œ.ย 


์™œ๋ƒ๋ฉด, ๋‚˜๋Š” ์†๊ฐ€๋ฝ์„ ๋—€ ์ดํ›„์— ์Šค์™€์ดํ”„ ๋””ํ…์…˜์„ ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์†๊ฐ€๋ฝ์ด ์ผ์ • ๊ฑฐ๋ฆฌ๋ฅผ ์›€์ง์ธ ๋‹ค์Œ์— ์Šค์™€์ดํ”„ ๋””ํ…์…˜์„ ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ์œผ๋‹ˆ๊นŒ.


์Šค์™€์ดํ”„๋ฅผ ์ฒดํฌํ•œ ์ดํ›„ ๊ด€๋ จ ๋กœ์ง์€ onSwipeDetected()์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , ์—ฌ๊ธฐ์„œ ์ž์ž˜ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ธ๋ฐ...๊ทธ ์ „์— checkSwipe ๋กœ์ง์„ ์‚ดํŽด๋ณด์ž.


bool checkSwipe(Vector3 downPos, Vector3 currentPos)

{

Vector2 currentSwipe = currentPos - downPos;

if (currentSwipe.magnitude >= minSwipeDist)

{

//Debug.Log("Swipe Detected : " + currentSwipe);

return true;

}

return false;

}


์—„์ฒญ ๊ฐ„๋‹จํ•จ, ๊ทธ๋ƒฅ ์†๊ฐ€๋ฝ ์ฒ˜์Œ ํ„ฐ์น˜ํ•œ ์œ„์น˜์™€ Update()์—์„œ ๋ฐ›์€ ํ˜„์žฌ ์†๊ฐ€๋ฝ ์œ„์น˜๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ์ผ์ • ๊ฑฐ๋ฆฌ ์ด์ƒ ์›€์ง์ด๋ฉด Swipe Detected๋กœ ํŒ์ •ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒŒ ๋.


์—ฌ๊ธฐ์„œ minSwipeDist๋Š” ์ ๋‹นํ•œ ๊ฑฐ๋ฆฌ๊ฐ’์„ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋‚˜๋Š” ์Šคํฌ๋ฆฐ ์‚ฌ์ด์ฆˆ์˜ 1/14 ์ •๋„๋กœ ์„ค์ •ํ•ด ๋†จ์–ด.ย 


void Awake()

{

Vector2 screenSize = new Vector2(Screen.width, Screen.height);

minSwipeDist = Mathf.Max(screenSize.x, screenSize.y) / 14f;

Debug.Log("MinSwipeDist : " + minSwipeDist);ย 

ย }


๊ทผ๋ฐ ํƒ€๋ธ”๋ › ์ข…๋ฅ˜๋‚˜ ์ด๋Ÿฐ ๊ฑฐ์—์„  ํ„ฐ์น˜๊ฐ์ด ์•ˆ ์ข‹์„์ง€๋„ ๋ชฐ๋ผ์„œ ์ด ๋ถ€๋ถ„ ๋กœ์ง์€ ๋‚˜๋„ ์ข€ ์˜๋ฌธ์ด ๋“œ๋„ค. Swipe Detection Distance ๊ด€๋ จํ•ด์„œ ์•„๋Š” ๊ฒƒ ์žˆ๋Š” ๋ถ„๋“ค์€ ์กฐ์–ธ ์ข€...




์ผ๋‹จ ๋ชจ๋ฐ”์ผ ํ„ฐ์น˜ ๋กœ์ง์€ ์œ„์™€ ๊ฐ™์ง€๋งŒ, PC์—์„œ ์Šค์™€์ดํ”„ ์ž…๋ ฅ์ด๋‚˜ ๋‹ค์–‘ํ•œ ๋””๋ฒ„๊ทธ๋ฅผ ์œ„ํ•ด์„œ ์ผ๋ถ€๋Ÿฌ PC์šฉ ๋กœ์ง๋„ ์งฐ์–ด.ย 


๋งˆ์šฐ์Šค Down, Up์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ๋กœ์ง์€ ์ „์ฒด์ ์œผ๋กœ ๋น„์Šทํ•˜๋‹ˆ ์ด์ชฝ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ณ ...


C++์ฒ˜๋Ÿผ ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋ฐ”์ผ๊ณผ PC ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Update๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€?


void Update()

{

#if UNITY_ANDROID

processMobileInput();

#else

processInput();

#endif

}


์ด ์‹œ์ ์—์„œ ์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„ :ย 


using UnityEngine;

using System.Collections;

using System;

public class GarlicInputManager : MonoBehaviour

{

Vector2 screenSize;

float minSwipeDist;

Vector2 swipeDirection;


void Awake()

{

Vector2 screenSize = new Vector2(Screen.width, Screen.height);

minSwipeDist = Mathf.Max(screenSize.x, screenSize.y) / 14f;

Debug.Log("MinSwipeDist : " + minSwipeDist);

}


void Update()

{

#if UNITY_ANDROID

processMobileInput();

#else

processInput();

#endif

}


Vector2 touchDownPos;

void processMobileInput()

{

if (Input.touches.Length > 0)

{

Touch t = Input.GetTouch(0);

if (t.phase == TouchPhase.Began)

{

//save began touch 2d point

touchDownPos = new Vector2(t.position.x, t.position.y);

}

else if (t.phase == TouchPhase.Moved)

{

Vector2 currentTouchPos = new Vector2(t.position.x, t.position.y);

bool swipeDetected = checkSwipe(touchDownPos, currentTouchPos);

swipeDirection = (currentTouchPos - touchDownPos).normalized;

if (swipeDetected)

onSwipeDetected(swipeDirection);

}

else if (t.phase == TouchPhase.Ended)

{

Debug.Log("Swipe End!");

}

}

}


Vector3 mouseDownPos;

void processInput()

{

if (Input.GetMouseButtonDown(0) == true)

{

mouseDownPos = Input.mousePosition;

}

else if (Input.GetMouseButton(0) == true)

{

bool swipeDetected = checkSwipe(mouseDownPos, Input.mousePosition);

swipeDirection = (Input.mousePosition - mouseDownPos).normalized;

if (swipeDetected)

onSwipeDetected(swipeDirection);

}

else if (Input.GetMouseButtonUp(0) == true)

{

Debug.Log("Swipe End!");

}

}


bool checkSwipe(Vector3 downPos, Vector3 currentPos)

{

//๋”œ๋ ˆ์ด ๋“ฑ์œผ๋กœ ์ธํ•ด ์ธํ’‹์„ ๋ง‰๊ณ  ์žˆ๋‹ค.

if (isInputBlocked == true)

return false;


Vector2 currentSwipe = currentPos - downPos;

if (currentSwipe.magnitude >= minSwipeDist)

{

//Debug.Log("Swipe Detected : " + currentSwipe);

return true;

}

return false;

}


void onSwipeDetected(Vector2 swipeDirection)

{

//Swipeย 

}


private bool isInputBlocked = false;

public void blockInput()

{

isInputBlocked = true;

}

public void unBlockInput()

{

isInputBlocked = false;

}


}


1)์ค‘๊ฐ„์— ๊ตต๊ฒŒ ์“ด normalized๋Š” ์Šค์™€์ดํ”„ ๋ฐฉํ–ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง. ํฌ๊ธฐ๊ฐ€ 1์งœ๋ฆฌ์ธ ๋ฒกํ„ฐ๋กœ ๋…ธ๋ง๋ผ์ด์ฆˆ ์‹œ์ผœ์ค˜.ย 

์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์–ด๋А ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์Œ.


์œ ๋‹ˆํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฒกํ„ฐ๋Š” ์“ธ๋งŒํ•œ ํ•จ์ˆ˜๊ฐ€ ์•„์ฃผ ๋งŽ์œผ๋‹ˆ ์œ ์šฉํ•˜๊ฒŒ ์ž˜ ์“ฐ๋Š” ๊ฒŒ ์ข‹์Œ. ๊ณ ๋“ฑํ•™์ƒ ๋•Œ ์ˆ˜ํ•™ ์•ˆ ์กธ๊ณ  ๋“ค์—ˆ์œผ๋ฉด ๊ฐ„๋‹จํ•œ ๋ฒกํ„ฐ ๊ด€๋ จ ์ด๋ก ์€ ์•Œ๊ณ  ์žˆ๊ฒ ์ง€?(๋ชจ๋ฅธ๋‹ค๋ฉด, ๋ฒกํ„ฐย ๊ด€๋ จ ๊ธฐ๋ณธ ์ง€์‹์€ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒŒ ๋ฐ˜์ฏค ํ•„์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•จ...์ƒ๊ฐํ•˜๋Š” ์ด์ƒ์œผ๋กœ ์ž์ฃผ, ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋‹ˆ๊นŒ...)


2)์ œ์ผ ์•„๋žซ๋‹จ์— ๋ณด๋ฉด blockInput ๊ด€๋ จ ๋กœ์ง์ด ์žˆ์–ด.


๊ณต๊ฒฉ ๋ชจ์…˜์„ ์ทจํ•˜๋Š” ๋„์ค‘(Attack Start) ์ƒํƒœ ๋“ฑ๋“ฑ์˜ ๊ฒฝ์šฐ, ๊ฐ•์ œ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ธํ’‹์„ ๋ง‰์•„๋ฒ„๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ด๋ฅผ ์œ„ํ•ด ๊ตฌํ˜„ํ–ˆ์Œ.ย 


checkswipe()์—์„œ ๊ฐ•์ œ๋กœ false๋ฅผ ๋Œ๋ ค์ค˜๋ฒ„๋ฆฌ๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋˜๊ฒ ์ง€?



----------------------------------


์—ฌ๊ธฐ๊นŒ์ง€ ์งœ๊ณ  ๋‚˜์„œ ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ๋Š”ย 


1.์‚ฌ์šฉ์ž๊ฐ€ ์†๊ฐ€๋ฝ์„ ๋–ผ์ง€ ์•Š๊ณ  ํ™”๋ฉด์„ ํ•œ ๋ฒˆ์— ์ญˆ์šฑ ๋ฐ€ ๊ฒฝ์šฐ, 2๋ฒˆ ์ด์ƒ์˜ swipe input์ด ๋“ค์–ด๊ฐ€๋ฒ„๋ฆผ.

->์›์ธ์€ touch down pos๋Š” ๊ทธ๋Œ€๋กœ์ธ๋ฐ current pos๋Š” ๊ณ„์† ์—…๋ฐ์ดํŠธ ๋˜๊ณ  ์žˆ์œผ๋‹ˆ, ์ž…๋ ฅ์„ ๊ฐ•์ œ๋กœ ๋ง‰๊ณ  ์žˆ๋˜ isInputBlocked๊ฐ€ false๊ฐ€ ๋˜์ž๋งˆ์ž ๊ณง๋ฐ”๋กœ ํ„ฐ์น˜ ์ž…๋ ฅ์ด ๋“ค์–ด๊ฐ€๋ฒ„๋ฆฌ๋Š” ๊ฒƒ.

ํ•œ ๋ฒˆ ์Šค์™€์ดํ”„๋ฅผ ํ–ˆ์œผ๋ฉด, ์†๊ฐ€๋ฝ์„ ๋–ผ๊ณ , ๋‹ค์‹œ ํ„ฐ์น˜ํ•œ ํ›„, ์Šค์™€์ดํ”„๋ฅผ ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด ์ฃผ๋ฉด ํ•ด๊ฒฐ๋˜๊ฒ ์ง€?


2.์—„~~~์ฒญ ์ฒœ์ฒœํžˆ ์†๊ฐ€๋ฝ์„ ๋ฐ€์–ด๋„, ํ™”๋ฉด์—์„œ ์†๊ฐ€๋ฝ์„ ๋–ผ์ง€ ์•Š์œผ๋ฉด ์ผ์ • ๊ฑฐ๋ฆฌ๋ฅผ ์›€์ง์ด์ž๋งˆ์ž ์Šค์™€์ดํ”„ ์ธํ’‹์ด ๋“ค์–ด๊ฐ.

->์ด๊ฑด ๋„ํŠธ ์ฐ๋А๋ผ ์•„์ง ๋ชป ๊ณ ์นจ, ์•„๋งˆ ํ„ฐ์น˜ ๋‹ค์šด์‹œ์— Timestamp๋ฅผ ๊ธฐ๋กํ•ด๋‘๊ณ  (์Šค์™€์ดํ”„ ๊ฑฐ๋ฆฌ / ์Šค์™€์ดํ”„ ์‹œ๊ฐ„ = ์Šค์™€์ดํ”„ ์†๋„) ๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์ผ์ • ์Šคํ”ผ๋“œ ์ด์ƒ์œผ๋กœ ์Šค์™€์ดํ”„ํ–ˆ์œผ๋ฉด ์ž…๋ ฅ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ง€? ์•„๋‹ˆ๋ฉด ์ฝ”๋ฃจํ‹ด ๋“ฑ์œผ๋กœ 0.5~1์ดˆ๋งˆ๋‹ค touch down pos๊ฐ€ ๋ฆฌ์…‹๋˜๋„๋ก ํ•ด ์ค˜๋„ ๋  ๊ฒƒ ๊ฐ™๋„ค.ย 


1๋ฒˆ์€ ํ•ด๊ฒฐํ–ˆ๊ณ  2๋ฒˆ์€ ์•„์ง ๋ฏธ๋ฃจ๊ณ  ์žˆ๋Š”๋ฐ, 1๋ฒˆ์€ ๊ทธ๋ƒฅ boolean ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฃผ๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ๋ฌธ์ œ๋‹ˆ๊นŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์งœ๋ฉด ๋  ๊ฑฐ์•ผ


bool swiped = false;

void processMobileInput()

{

if (Input.touches.Length > 0)

{

Touch t = Input.GetTouch(0);

if (t.phase == TouchPhase.Began)

{

//save began touch 2d point

touchDownPos = new Vector2(t.position.x, t.position.y);

swiped = false; //์†๊ฐ€๋ฝ์„ ๋—€ ํ›„ ๋‹ค์‹œ ํ™”๋ฉด์„ ํ„ฐ์น˜ํ•˜๊ธฐ ์ „์—๋Š” ์ž…๋ ฅ์„ ๋ง‰๋Š”๋‹ค

}

else if (t.phase == TouchPhase.Moved)

{

Vector2 currentTouchPos = new Vector2(t.position.x, t.position.y);

bool swipeDetected = checkSwipe(touchDownPos, currentTouchPos);

swipeDirection = (currentTouchPos - touchDownPos).normalized;

if (swipeDetected)

onSwipeDetected(swipeDirection);

}

else if (t.phase == TouchPhase.Ended)

{

Debug.Log("Swipe End!");

swiped = true;

}

}

}


void processInput()

{

if (Input.GetMouseButtonDown(0) == true)

{

mouseDownPos = Input.mousePosition;

swiped = false;

}

else if (Input.GetMouseButton(0) == true)

{

bool swipeDetected = checkSwipe(mouseDownPos, Input.mousePosition);

swipeDirection = (Input.mousePosition - mouseDownPos).normalized;

if (swipeDetected)

onSwipeDetected(swipeDirection);

}

else if (Input.GetMouseButtonUp(0) == true)

{

Debug.Log("Swipe End!");

swiped = true;

}

}


bool checkSwipe(Vector3 downPos, Vector3 currentPos)

{

//์†๊ฐ€๋ฝ์„ ์•„์ง ์•ˆ ๋—์ง€๋งŒ ์ธํ’‹์€ ์ž…๋ ฅ๋ฐ›์•˜๋‹ค.

if (swiped == true)

return false;

//๋”œ๋ ˆ์ด ๋“ฑ์œผ๋กœ ์ธํ•ด ์ธํ’‹์„ ๋ง‰๊ณ  ์žˆ๋‹ค.

if (isInputBlocked == true)

return false;


Vector2 currentSwipe = currentPos - downPos;

if (currentSwipe.magnitude >= minSwipeDist)

{

//Debug.Log("Swipe Detected : " + currentSwipe);

return true;

}

return false;

}


void onSwipeDetected(Vector2 swipeDirection)

{

//Swipe, ๊ฐ์ข… ๊ฒŒ์ž„ ๋กœ์ง์€ ์ด ์•ˆ์— ๊ตฌํ˜„

swiped = true;

}




์ด์ œ swipeDirection์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋กœ์ง์„ onSwipeDetected์— ๋„ฃ๊ณ  ์ฒ˜๋ฆฌํ•˜๋ฉด ๋  ๊ฑฐ์•ผ.


---------------------------------------------


**๋ณด๋„ˆ์Šค - Action์„ ์ด์šฉํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ์ธํ’‹ ์‹œ์Šคํ…œ


์กฐ๊ธˆ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ์‹œ์Šคํ…œ ๊ตฌํ˜„ ์‹œ์— ๋งค์šฐ ์œ ์šฉํ•œ ๋ถ€๋ถ„์ด๋ผ์„œย ์กฐ๊ธˆ ์ฒจ๊ฐ€ํ•จ.


์˜ˆ์ „์— ์•ˆ๋“œ๋กœ์ด๋“œ ๋…ํ•™ํ•˜๋ฉด์„œ ๋А๋‚€ ๊ฑด๋ฐ On~~~ ๋“ฑ์˜ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์Šคํ…œ์€ ์—„์ฒญ ํŽธ๋ฆฌํ•˜๊ณ  ์ข‹์Œ.ย 


ํ•จ์ˆ˜ ์ด๋ฆ„์—์„œ๋ถ€ํ„ฐ ์–ด๋А ์‹œ์ ์— ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ , ๊ฐ์ฒด์ง€ํ–ฅ์  ๋…ผ๋ฆฌ์—๋„ ์ž˜ ๋“ค์–ด๋งž๋Š” ํŽธ์ธ ๊ฒƒ ๊ฐ™๊ณ ...


์–ด์จŒ๋“  c#์˜ delegate ์‹œ์Šคํ…œ์„ ์“ฐ๋ฉด ์ด๊ฑธ ์—„์ฒญ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋Š”ย ์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ๊ฑฐ์•ผ.


์˜ˆ๋ฅผ ๋“ค์ž๋ฉด add() ํ•จ์ˆ˜์™€ subtract() ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ , delegate๋กœ ์„ ์–ธํ•œ addAndSubtract ๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,


addAndSubtract += add;

addAndSubtract += subtract;

//add();

//subtract();

//์•„๋ž˜ ์ฝ”๋“œ๋Š” ์œ„ 2์ค„๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋ณด์ž„

addAndSubtract();


์œ„์— ์ฝ”๋“œ๋Š” ์—„์ฒญ ๋Œ€์ถฉ ์„ค๋ช…ํ•œ ๊ฑฐ๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๊ทธ๋Ÿฐ ๊ฑฐ๊ตฌ๋งŒ~ ํ•˜๊ณ  ๊ฐœ๋…๋งŒ ์žก๊ณ  ๋„˜์–ด๊ฐ€์ž


C#์—์„œ๋Š” Action์ด๋‚˜ Func ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š”๋ฐ, ์ž˜ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์€ ์Šคํ‚ตํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ ์ž๋ฃŒ๋ฅผย ๊ตฌ๊ธ€์—์„œ ๊ฒ€์ƒ‰ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ๊ณ„์†ํ•˜๋Š” ๊ฑธ ์ถ”์ฒœํ•จ. ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ธฐ์—” ์‚ฌ์‹ค ๋‚˜๋„ ๊ทธ๋ฆฌ ์ •ํ™•ํ•˜๊ฒŒ ์•„๋Š” ๊ฑด ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ณ , ํ›จ์”ฌ ์œ ์šฉํ•œ ์ž๋ฃŒ๋„ ๋งŽ๊ณ ...


์–ด์จŒ๋“  ๊ณ„์†ํ•˜์ž๋ฉด, ์œ„ ์ฝ”๋“œ์—์„œ๋Š” OnSwipe~~~ ํ•จ์ˆ˜์— Action์„ย ์‘์šฉํ•  ๊ฑฐ์•ผ.


์™œ?


OnSwipe~~ ํ•จ์ˆ˜์—์„œ swipeDirection ๋ฒกํ„ฐ๋ฅผ ์‘์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ํ•„์—ฐ์ ์œผ๋กœ ๊ฒŒ์ž„ ์‹œ์Šคํ…œ ๋กœ์ง๊ณผ ์ธํ’‹ ์‹œ์Šคํ…œ ๋กœ์ง์ด ์„ž์—ฌ๋ฒ„๋ฆฌ๊ฒŒ ๋ผ.


๊ฒŒ์ž„ ๋กœ์ง์ด ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์•ˆ ๋˜๊ฒ ์ง€๋งŒ, ์ ์  ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ์ธํ’‹ ๋กœ์ง๊ณผ ์‹œ์Šคํ…œ ๋กœ์ง์ด ๊ผฌ์ด๋ฉด์„œ ์ฝ”๋“œ๋Š” ๊ทธ์ง€๊ฐ™์•„์ง€๊ณ  ๊ฐœ๋ฐœ ์†๋„๋Š” ๋А๋ ค์ง€๋‹ค๊ฐ€ ์•„ ์‹œ๋ฐœ ์•ˆ ๋งŒ๋“ค์–ด, ํ•˜๋ฉด์„œ ๋•Œ๋ ค์ณ๋ฒ„๋ฆฌ๊ฒ ์ง€?


๊ทธ๋ž˜์„œ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด ๋‘๋Š” ๊ฑฐ์•ผ. (์‚ฌ์‹ค ์ด ๋ฉด์—์„œ ๋ณด์ž๋ฉด, ์œ„์— processInput()๊ณผ processMobileInput() ๋กœ์ง๋„, ์ค‘๋ณต ๋กœ์ง์ด 2๋ฒˆ ๋“ค์–ด๊ฐ€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์ˆ˜๊ฒ ์ง€? ์ข€์ด๋”ฐ ํ•ด์•ผ์ง€...)


์ด ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒŒ delegate ๊ด€๋ จ ์‹œ์Šคํ…œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ์–ด๋‘๋Š” ๊ฒƒ.


์œ„์—์„œ ์ง  OnSwipe~~ ๋กœ์ง์—๋Š” ์–ด๋А ๋ฐฉํ–ฅ์œผ๋กœ ํ„ฐ์น˜ ์ธํ’‹์ด ๋“ค์–ด๊ฐ”๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” Vector2 ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ์–ด.ย 


๋ฆฌํ„ด๊ฐ’์ด ์—†๋Š” ํ•จ์ˆ˜๋Š” Action์„ ์“ฐ๋ฉด ํŽธ๋ฆฌํ•˜๋‹ˆ๊นŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•ด.


Action<Vector2> actionOnSwipeDetected;


๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์ง  OnSwipe ๋กœ์ง ์•ˆ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด :ย 


void onSwipeDetected(Vector2 swipeDirection)

{

swiped = true;

actionOnSwipeDetected(swipeDirection);

}


๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒŒ์ž„ ์‹œ์Šคํ…œ ๋กœ์ง์€ actionOnSwipeDetected ์•ก์…˜์— ํ• ๋‹นํ•˜์—ฌ ๋ถ„๋ฆฌํ•˜๊ณ , ์ธํ’‹ ๊ด€๋ จ ์ฝ”์–ด ๋กœ์ง(swiped = true;) ์€ ์ธํ’‹ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค ์•ˆ์— ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ง€.


์•ก์…˜์€ ๋ณ€์ˆ˜๋ž‘ ๋น„์Šทํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ๋‹ค์Œ๊ณผ ๊ฐ™์ด public์œผ๋กœ ์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•ก์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด :ย 


public void setOnSwipeDetected(Action<Vector2> onSwipeDetected)

{

actionOnSwipeDetected = onSwipeDetected;

}


์ธํ’‹ ํด๋ž˜์Šค์™€ ๊ฒŒ์ž„ ์‹œ์Šคํ…œ ํด๋ž˜์Šค๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์ง€?


์˜ˆ๋ฅผ ๋“ค์–ด ABC๋ผ๋Š” ํด๋ž˜์Šค์—์„œ myOnSwipeDetected() ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ํ•ด ๋ณด์ž. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธํ’‹ ํด๋ž˜์Šค์— ํ• ๋‹นํ•˜๋ฉด ๋ผ.


public class ABC : MonoBehaviour

{

GarlicInputManager inputManager;


// Use this for initialization

void Awake ()ย 

{

inputManager = GetComponent<GarlicInputManager>();

inputManager.setOnSwipeDetected(myOnSwipeDetected);

}


void myOnSwipeDetected(Vector2 swipeDirection)

{

Debug.DrawLine(transform.position, transform.position + swipeDirection, Color.red, 2f);

}

}


์ด์ œ ์Šค์™€์ดํ”„๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค ABC ํด๋ž˜์Šค ์•ˆ์˜ myOnSwipeDetected๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์Šค์™€์ดํ”„ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋””๋ฒ„๊ทธ ๋ผ์ธ์ด ๊ทธ๋ ค์งˆ ๊ฑฐ์•ผ.


์ฒ˜์Œ์—๋Š” ๋‹ค์†Œ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒ ์ง€๋งŒ, ์ด ๋ถ€๋ถ„์„ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋ฉด ํ›จ์”ฌ ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ์ฒซ ๋ฐœ์„ ๋‚ด๋”›๋Š” ๊ฑฐ๋‹ˆ๊นŒ ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•˜์ž!


๋งˆ๋ฌด๋ฆฌ๋กœ, ์ „์ฒด ์ตœ์ข… ์ฝ”๋“œ ์ฒจ๋ถ€ :ย 


using UnityEngine;

using System.Collections;

using System;

public class GarlicInputManager : MonoBehaviour

{

Vector2 screenSize;

float minSwipeDist;

Vector2 swipeDirection;


Action<Vector2> actionOnSwipeDetected;


void Awake()

{

Vector2 screenSize = new Vector2(Screen.width, Screen.height);

minSwipeDist = Mathf.Max(screenSize.x, screenSize.y) / 14f;

Debug.Log("MinSwipeDist : " + minSwipeDist);

}


void Update()

{

#if UNITY_ANDROID

processMobileInput();

#else

processInput();

#endif

}


Vector2 touchDownPos;

bool swiped = false;

void processMobileInput()

{

if (Input.touches.Length > 0)

{

Touch t = Input.GetTouch(0);

if (t.phase == TouchPhase.Began)

{

//save began touch 2d point

touchDownPos = new Vector2(t.position.x, t.position.y);

swiped = false;

}

else if (t.phase == TouchPhase.Moved)

{

Vector2 currentTouchPos = new Vector2(t.position.x, t.position.y);

bool swipeDetected = checkSwipe(touchDownPos, currentTouchPos);

swipeDirection = (currentTouchPos - touchDownPos).normalized;

if (swipeDetected)

onSwipeDetected(swipeDirection);

}

else if (t.phase == TouchPhase.Ended)

{

Debug.Log("Swipe End!");

swiped = true;

}

}

}


Vector3 mouseDownPos;

void processInput()

{

if (Input.GetMouseButtonDown(0) == true)

{

mouseDownPos = Input.mousePosition;

swiped = false;

}

else if (Input.GetMouseButton(0) == true)

{

bool swipeDetected = checkSwipe(mouseDownPos, Input.mousePosition);

swipeDirection = (Input.mousePosition - mouseDownPos).normalized;

if (swipeDetected)

onSwipeDetected(swipeDirection);

}

else if (Input.GetMouseButtonUp(0) == true)

{

Debug.Log("Swipe End!");

swiped = true;

}

}


bool checkSwipe(Vector3 downPos, Vector3 currentPos)

{

//์†๊ฐ€๋ฝ์„ ์•„์ง ์•ˆ ๋—์ง€๋งŒ ์ธํ’‹์€ ์ž…๋ ฅ๋ฐ›์•˜๋‹ค.

if (swiped == true)

return false;

//๋”œ๋ ˆ์ด ๋“ฑ์œผ๋กœ ์ธํ•ด ์ธํ’‹์„ ๋ง‰๊ณ  ์žˆ๋‹ค.

if (isInputBlocked == true)

return false;


Vector2 currentSwipe = currentPos - downPos;

if (currentSwipe.magnitude >= minSwipeDist)

{

//Debug.Log("Swipe Detected : " + currentSwipe);

return true;

}

return false;

}



//public float speed = 5f;

//Vector3 vel;


public void setOnSwipeDetected(Action<Vector2> onSwipeDetected)

{

actionOnSwipeDetected = onSwipeDetected;

}

void onSwipeDetected(Vector2 swipeDirection)

{

swiped = true;

actionOnSwipeDetected(swipeDirection);

}


private bool isInputBlocked = false;

public void blockInput()

{

isInputBlocked = true;

}

public void unBlockInput()

{

isInputBlocked = false;

}


}


์œ„ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•œ ๊ฒŒ์ž„ ํ…Œ์ŠคํŠธ :ย 



viewimage.php?id=2abcdd23dad63db0&no=29bcc427b28277a16fb3dab004c86b6fc58f455ca050d53987cdf316138e58cb696767ebeb216c8821e423e65e8894e713e8c61a05e1b056c6ac