Skip to the content.

← go back to the list

환경 교육 기능성게임 : “Zero-Earth”

1. Introduction

1.1 Background

image

1.2 Purpose

2. Main Contents

2.1 Scenario

미리보기

2.1.1 Pre-Stage

  1. 게임을 실행
  2. [How to Play] 선택을 통해 게임 수행 방법을 알아봄
  3. 순차적 게임 진행을 위해 [Stage 1]을 선택

2.1.2 Stage 1

  1. 미션 “다 마신 컵을 헹궈서 버려주세요!”를 수행하기 위해 [Water Sink]를 선택.
  2. “컵을 위 아래로 흔드세요!”라는 설명을 읽고, 컵을 움켜쥐고 위아래로 흔드는 제스처 수행.
  3. 컵이 비워지는 것을 확인.
  4. 비워진 컵을 잡고 [플라스틱]에 놓음으로써 분리 배출.
  5. 미션 성공을 확인하고, [Next Stage]를 선택하여 다음 스테이지로 이동.

2.1.3 Stage 2

  1. 미션 “내용물이 남은 포장 용기를 씻어서 버려주세요!”를 수행하기 위해 [Water Sink]를 선택.
  2. “용기를 앞뒤로 흔드세요!”라는 설명을 읽고, 용기를 움켜쥐고 앞뒤로 흔드는 제스처 수행.
  3. 용기가 비워지는 것을 확인.
  4. 비워진 용기를 잡고 [플라스틱]에 놓음으로써 분리 배출.
  5. 미션 성공을 확인하고, [Next Stage]를 선택하여 다음 스테이지로 이동

2.1.4 Stage 3

  1. 미션 “페트병의 비닐을 뜯어서 버려주세요!”를 수행하기 위해 [Cutter]를 선택.
  2. “칼을 집어서, 페트병 위에 올려 놓으세요!”라는 설명을 읽고, 커터칼을 잡고 페트병 위에 가져다 댐.
  3. 페트병 위 라벨이 제거되는 것을 확인.
  4. 라벨이 없는 페트병을 잡고 [페트]에 놓음으로써 분리 배출.
  5. 미션 성공을 확인하고, [Next Stage]를 선택하여 다음 스테이지로 이동

2.1.5 Stage 3

  1. 미션 “테이프를 떼어내 박스를 버려주세요!”를 수행하기 위해 [Cutter]를 선택.
  2. “칼을 들어서, 상자 위에 올려 놓으세요!”라는 설명을 읽고, 커터칼을 잡고 상자 위에 가져다 댐.
  3. 상자 위 테이프가 제거되는 것을 확인.
  4. 테이프가 없는 상자를 잡고 [종이]에 놓음으로써 분리 배출.
  5. 미션 성공을 확인하고, [Next Stage]를 선택하여 다음 스테이지로 이동

2.1.6 Stage 4

  1. 미션 “남아있는 가스를 내보낸 뒤 버려주세요!”를 수행하기 위해 [Screwdriver]를 선택.
  2. “손을 위 모양으로 만들고, 가스통 위에 올려 놓으세요!” 라는 설명을 읽고, 화면의 이미지를 참고하여 뾰족한 손가락을 만든 뒤, 부탄가스 위에 가져다 댐.
  3. 부탄가스에서 가스가 나가는 것을 확인.
  4. 가스가 없는 부탄가스 통을 잡고 [캔류]에 놓음으로써 분리 배출.
  5. 미션 성공을 확인하고, [Next Stage]를 선택
  6. Zero Earth Success 화면에 도달하고, 게임 종료를 위해 [Quit]를 선택. (*추후 스테이지 추가 가능. 현재 최고 스테이지.)

2.2 Prototype

2.2.1 첫 화면

첫 화면에서 How to Play 버튼을 통해 전체 게임의 흐름을 알 수 있고, Start 버튼을 통해 Stage 선택 화면으로 이동한다. First

2.2.2 How to Play

게임의 전체적인 진행 순서를 설명한다. Start 버튼을 통해 Stage 선택 화면으로 이동한다. HowtoPlay

2.2.3 Stage 선택

사용자가 각 스테이지를 선택하여 플레이 할 수 있다. ChooseStage

2.2.4 Stage 1 ~ 5 : 도구 선택

각 스테이지의 쓰레기를 분리수거 하기 위한 도구를 선택한다. StageTool

2.2.5 Stage 1 ~ 5 : 분리수거를 위한 전처리

각 스테이지의 쓰레기를 분리수거 하기 위한 행동을 한다. StageAct

2.2.6 Stage 1 ~ 5 : 쓰레기통 선택

각 스테이지의 쓰레기를 버리기 위한 쓰레기통을 선택한다. StageBin StageClear

2.2.7 잘못된 선택지를 고른 경우

잘못된 선택지를 고른 경우 에러 화면이 뜨고, Back to Game 버튼을 누르면 이전 화면으로 되돌아간다. StageBin

2.2.8 게임 종료

모든 스테이지를 완료했으면, 스테이지를 완료했다는 안내 화면을 띄운다. Go to Main 버튼을 통해 첫 화면으로 돌아가거나, Quit 버튼을 통해 게임을 종료한다. Clear

2.3 User Test

image image image image

2.3.1 Date, Time, Place

2.3.2 Participants

2.3.3 What to See

2.3.4 수정 적용된 인사이트/피드백

StageMission

2.3.5 추후 수정 예정인 인사이트/피드백

2.4 Source Code

2.4.1 기본 움직임

Leap motion을 통해 인식되는 손(Hand)과 손가락(Finger) Import.

controller = new Controller();
Frame frame = controller.Frame();
List<Hand> hands = frame.Hands;
List<Finger> fingers = hands[0].Fingers;

leapmotion 연결 -> controller.IsConnected가 ture일 경우 손 움직임에 따라 Hand Object 위치 이동

if (controller.IsConnected){
	this.transform.position = new Vector3(hands[0].PalmPosition[0] / 30, -hands[0].PalmPosition[2] / 30, 0);
        }
else this.transform.position = new Vector3(0, 0, 0);

‘fingers[n]’ : n번째 손가락 인식

손가락 접히는 것 인식하면 “Sprites/hand” 폴더의 0번째 이미지로 변경 (주먹) , 그 외 “Sprites/hand”폴더의 1번째 이미지로 변경 (손 펼침)

if (fingers[1].IsExtended == false &
    fingers[2].IsExtended == false &
    fingers[3].IsExtended == false){
    	SpriteRenderer spriteR = gameObject.GetComponent<SpriteRenderer>(); // gameObject의 SpriteRenderer
	Sprite[] sprites = Resources.LoadAll<Sprite>("Sprites/hand");
	spriteR.sprite = sprites[0];
        }
else {
	SpriteRenderer spriteR = gameObject.GetComponent<SpriteRenderer>();
	Sprite[] sprites = Resources.LoadAll<Sprite>("Sprites/hand");
	spriteR.sprite = sprites[1];
}

gameObject(=this)(사용자 손)의 위치가 ‘target1’ object의 범위 안에 있으면서 손가락을 굽히면 ‘How to play’ Scene으로 씬 전환

if (this.transform.position.y > target1.transform.position.y - 0.5f &
    this.transform.position.y < target1.transform.position.y + 0.5f &
    this.transform.position.x > target1.transform.position.x - 1.0f &
    this.transform.position.x < target1.transform.position.x + 1.0f &
    fingers[1].IsExtended == false){
    	SceneManager.LoadScene("How to play"); // 씬 전환
        }

2.4.2 Stage 1 미션 주요 움직임

hand.ParmVelocity : The speed and movement direction of the palm in millimeters per second.

`hands[0].PalmVelocity.y’ : y축에 대해 손 움직임의 속도를 측정.

-3500 이하일 때 ‘full’ object의 이미지가 “Sprites/stage1” 폴더에 있는 이미지 요소로 변경

if (hands[0].PalmVelocity.y < -3500){
	SpriteRenderer spriteR = full.GetComponent<SpriteRenderer>();
	Sprite[] sprites = Resources.LoadAll<Sprite>("Sprites/stage1");
	spriteR.sprite = sprites[0];
        Invoke("Scenechange", 3); // 3초 뒤 Scenechange 함수 실행
	}

2.4.3 Stage 2 미션 주요 움직임

`hands[0].PalmVelocity.z’ : z축에 대해 손 움직임의 속도를 측정.

-2500 이하일 때 ‘waste’ object의 이미지가 “Sprites/stage2” 폴더에 있는 이미지 요소로 변경

if (hands[0].PalmVelocity.z < -2500){
	SpriteRenderer spriteR = waste.GetComponent<SpriteRenderer>();
	Sprite[] sprites = Resources.LoadAll<Sprite>("Sprites/stage2");
	spriteR.sprite = sprites[0];
        Invoke("Scenechange", 3); // 3초 뒤 Scenechange 함수 실행
	}

2.4.4 Stage 3, 4 미션 주요 움직임

‘cutter’ object가 ‘rabel’ object 위에 위치하면서 손을 펴면 ‘rabel’의 이미지가 “Sprites/norabel” 폴더의 이미지로 변경됨.

if (rabel.transform.position.y > cutter.transform.position.y - 1.0f &
    rabel.transform.position.y < cutter.transform.position.y + 1.0f &
    rabel.transform.position.x > cutter.transform.position.x - 1.0f &
    rabel.transform.position.x < cutter.transform.position.x + 1.0f &
    fingers[1].IsExtended == true){
    	SpriteRenderer spriteR = rabel.GetComponent<SpriteRenderer>();
	Sprite[] sprites = Resources.LoadAll<Sprite>("Sprites/norabel");
	spriteR.sprite = sprites[0];
        
	if (flag == 0){ // object가 한 번만 생성될 수 있도록 함. 
		Invoke("Vinyl", 0.01f); // Vinyl 함수 실행
        }
      	Invoke("Scenechange", 5);
}

void Vinyl(){
	Instantiate(vinyl, new Vector3 (0.8f, -1.6f, 0), Quaternion.identity); // object 생성 함수: Instantiate(object, location, rotation)
        flag = 1;
}

2.4.5 Stage 5 미션 주요 움직임

검지 폄 + 중지, 약지 구부리면 손 이미지를 “Sprites/stage5” 폴더의 이미지로 변경

if (fingers[1].IsExtended == true &
    fingers[2].IsExtended == false &
    fingers[3].IsExtended == false) {
    	SpriteRenderer spriteR = gameObject.GetComponent<SpriteRenderer>();
	Sprite[] sprites = Resources.LoadAll<Sprite>("Sprites/stage5");
	spriteR.sprite = sprites[0];
        }

3. Discussion

3.1 Limitations and future studies

본 연구는 기존의 환경교육 방법의 문제를 해결하기위해 기능성 게임을 기획하였다. 5가지의 분리배출 미션을 통해 방법을 익히고 립모션을 활용하여 게임을 즐기게 되면서 긍정적인 학습경험을 제공하고 교육 효과를 극대화할 수 있다는 점에서 본 연구는 유의미한 가치를 전달해주었다. 초기 설계와 달리 Zero-earth를 개발하고 유저테스트를 통해 우리는 대표적으로 다음과 같은 한계를 발견할 수 있었다.

우리는 위와 같은 한계를 극복하기 위해 사용자들이 플로우를 이해할 수 있도록 직관적으로 인터페이스를 수정하였으며, 화면이 빠르게 넘어가는 에러를 방지하기 위해 화면을 추가하는 등 사용자가 기능을 이용하는데 어려움이 없도록 계속 고민하고 개발하였다. 전 세대가 Zero-earth를 활용할 수 있도록 다양한 컨텐츠를 추가한다면 환경 교육현장에 또 다른 가치를 가져다 줄 수 있을 것이다.

3.2 Conclusion

image image

[그림] 다양한 기능성 게임 컨텐츠

환경보전에 대한 관심이 높아지면서 환경교육은 선택이 아닌 기본으로 교육현장에서 이루어지고 있다. 환경교육이 활성화되면서도 학습자가 재미있게 배우고 학습하기 위한 교육 방법은 지속적인 연구가 필요한 부분이다. Leap motion을 이용한 환경교육 기능성게임은 기존 교육방법의 한계를 깨고, 환경보전의 중요성에 대해 인식할 수 있도록 하는 효과적인 방법이 될 것이라 생각한다.

더 나아가서, 생태환경체험관이나 숲유치원 같은 교육시설에서도 Zero-earth를 유용하게 활용할 수 있을 것이다. 따라서, 어린이들에게 립모션을 통한 환경 게임을 경험하도록 하고, 자연의 소중함과 환경생태 감수성을 높일 수 있도록 해당 게임을 제안한고자 한다. 목적이 명확한 기능성 게임이 현실에서 해결하기 어려운 환경 문제를 게임 메커니즘으로 쉽게 풀어낼 수 있기 때문에 더욱이 교육적 효과가 있을 것이다. 또한 기능성 게임이라고 단순히 기능적인 부분만 치우치는 것이 아닌 보상을 주거나, 재미 요소를 더욱 부여하는 등 완성도를 높인다면 전국의 교육현장에서 다양하게 활용이 가능하리라 생각한다.

3.3. Reference

https://developer-archive.leapmotion.com/documentation/csharp/api/Leap.Finger.html#extension-functions