Курсовая работа (т): Создание интерактивной книги средствами Unity3d

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Создадим проект. В окне Project в папке Assets, создадим подпапку Sprites, где будем хранить спрайты - графические файлы, необходимые для отображения персонажей, фона, пола, бонусов и прочих игровых объектов. Настроить камеру [9]. Камера поддерживает два режима (вида проекции): перспективный (Perspective) и ортогональный (Orthographic). Первый используется во всех 3d-играх: объекты, расположенные дальше от камеры, выглядят меньше. Это почти то, как мы видим наш мир. Нам нужен второй режим, Orthographic - объекты всегда рисуются реального размера и перекрывают друг друга в зависимости от расстояния до камеры. Идеальный режим камеры для 2d и изометрии [10]. На объекте Сamera лежит компонент Сamera в нем нужно указать Projection - Orthagraphic. После создания фона, можно перейти к основному объекту. Для этого из папки Assets мы перетягиваем используемый объект в редактор сцены. В инспекторе объекта, создаем Box Collider 2D, из раздела Physics 2D для того, чтобы можно было заусть анимацию по клику на объект [11]. Во вкладке «Animation» создаем анимацию и располагаем кадры так, как должна выглядеть анимация объекта.Во вкладке «Animator»нужно настроить управление этой анимации, с помощью связей. После чего переходим к написанию скрипта для анимации объекта.

Для анимации объектов используется C# скрипт:

using UnityEngine;System.Collections;class actionscript : MonoBehaviour {Animator anim;int count=0;Start(){= GetComponent<Animator>();}OnMouseDown(){(Time.timeScale != 0) {(count % 2 != 0) {.SetBool ("action", true);

}(count % 2 == 0) {.SetBool ("action", false);

}++;

}

}

При нажатие на элемент, на котором уже висит коллайдер срабатывает функция OnMouseDown(), которая переключает состояние анимации.

4.3 Разработка мини игр


Родителям детей иногда хочется поторопить время и сделать своих малышей старше их возраста. Едва ли не с самого рождения взрослые учат детей чтению, счету, отдают предпочтение энциклопедическим знаниям, но забывают о играх, хотя это один из основных инструментов для познания информации окружающего нас мира. Вообще, все, что ребенок делает в течение дошкольного детства, становится основой не только формирования двигательных навыков, но и интеллектуального, социального и эмоционального развития. Поэтому были сделаны игры: «Поймай», «Найти», «Пятнашки», для развития тонкой моторики, внимания и логики.

Игра «Поймай»

У детей до школьного возраста сложно провести границу между физическим, в частности двигательным, развитием, с одной стороны, и интеллектуальным - с другой. В дошкольные годы дети совершенствуют двигательные навыки, в том числе моторику: грубую (способность совершать движения большой амплитуды: бег, прыжки, бросание предметов) и тонкую (способность совершать точные движения малой амплитуды). По мере развития тонкой моторики дети становятся все более самостоятельными, что заметно при выполнении ими повседневных действий. Развитие моторики позволяет ребенку непринужденно передвигаться, самому заботиться о себе и проявлять свои творческие способности.

Смысл игры «Поймай» заключается в том, что нужно насобирать как можно больше баллов за определенное время. Имеются разных размеров и цветов звезды. Каждая звезда имеет свой балл, который можно получить, собрав их. А собирает звезды Гадкий утенок, который бегает по экрану горизонтально.

Для данной игры используется скрипт С#:

void OnMouseDrag()

{if(Time.timeScale!=0){= new Vector3(Input.mousePosition.x,0,0);= Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;(curPosition.x < xMax) {(curPosition.x > xMin) {

transform.position = curPosition;

}

}

Функция OnMouseDrag() отвечает за горизонтальное передвижения утенка по сцене, при зажатом коллайдоре.

Игра «Найти»

Внимание - это такой процесс сознания, который действует избирательно и направлен на какой-либо объект. Если у ребенка высокий уровень развития внимания, то в дальнейшем это поможет ему при обучении в школе, он будет легче сосредотачиваться, и не будет отвлекаться. Пока ребенок маленький, внимание его непроизвольно, он не может управлять им, часто отвлекается от основного занятия, сосредоточиться ему сложно. В связи с этим любая деятельность ребенка дошкольного возраста непостоянна, охваченный впечатлениями он, не закончив одно дело, хватается за другое. Именно поэтому Игра№2 «Найти» разрабатывалась с целью развить у ребенка высокий уровень внимания.

Игра «Найти». Цель игры - найти как можно больше лягушек за определенное количество времени. Сцена разворачивается на болоте. Смысл заключается в том, что начинают появляться лягушки в разных метах сцены и за разными предметами, которых нужно найти. Когда находишь лягушку, она квакает.

Фрагмент из скрипта С#:

umerator Spawn ()

{float waitTime = Random.Range (minTimeBetweenSpawns, maxTimeBetweenSpawns);(Time.timeSinceLevelLoad > 30) {= Random.Range (minTimeBetweenSpawns/2, maxTimeBetweenSpawns/2);

}return new WaitForSeconds(waitTime);posX =Random.Range(leftSpawnPosX, rightSpawnPosX);posY = Random.Range(upSpawnPosY, downSpawnPosY);spawnPos = new Vector3(posX , posY,transform.position.z );D propInstance = Instantiate(backgroundProp, spawnPos, Quaternion.identity) as Rigidbody2D;

StartCoroutine(Spawn());

}

С помощью этого кода лягушки в игре появляются в случайном порядке и в количестве не больше 30 штук.

Игра «Пятнашки»

Дети очень быстро растут и развиваться. Поэтому разница между детьми 3-х лет и 5-и очень велика. К возрасту 5-7 лет дети должны уметь решать простые задачи и головоломки. К сожалению, играми часто пренебрегают, ошибочно считая, что они лишь развлекают детей и тратят их время. Но важно отметить, что игры бывают разными и если их правильно подобрать, то в игровой форме, можно подготовить ребенка к предстоящим трудностям в школе. Поэтому одна из игр - головоломка. Первые две игры в интерактивной книге довольно простые и возможно 5-и летний ребенок не заострит на них свое внимание, но обязательно остановится на третьей игре «Пятнашки».

Пятнашки - головоломка, представляющая собой 8 квадратных частей одной картинки. Все картинки заключены в квадратную рамку размером 3x3. Таким образом при размещении частей картинки в рамке остается одно пустое место размером с одну часть картинки, которое можно использовать для перемещения костяшек внутри коробки. Цель игры - собрать все изображение.

Небольшой кусок скрипта на написанный на языке программирования С#:

private void Shuffle()

{

//shuffle(int i = 0; i < Constants.MaxColumns; i++)

{(int j = 0; j < Constants.MaxRows; j++)

{(Matrix[i, j] == null) continue;random_i = Random.Range(0, Constants.MaxColumns);random_j = Random.Range(0, Constants.MaxRows);

//swap'em(i, j, random_i, random_j);

}

Метод private void Shuffle() в случайном порядке меняет местами части головоломки.

ЗАКЛЮЧЕНИЕ


В результате выполнения данной курсовой работы были получены следующие основные результаты:

●       Создан сценарий

●       Создан прототип

●       Выбран инструмент разработки

●       Разработана интерактивная книга

●       Произведено тестирование продукта

●       Оценены результаты

Книга была представлена нескольким пользователям различной возрастной категории:

●       2 ребенка (2-5 лет)

●       Взрослые (4 человека 40-70 лет)

Как оказалось, полученная реакция совпадает в пределах одной категории возраста и рознится с реакцией пользователей из других категорий. Так, дети приходили в восторг при первом просмотре книги и внимательно следили за всем происходящем, однако, при повторном использовании продукта через некоторое время интерес спадал. Это говорит о том, для детей важно постоянное обновление всей информации, получаемой извне. Молодежь относилось с интересом, восторг наблюдался у единиц. Повторное использование производилось без заметной заинтересованности. Взрослому контингенту игра одинаково нравилась как при презентации продукта, так и при повторных использованиях.

Таким образом, можно сделать вывод, что наибольший успех книга имела у своей целевой аудитории (детей), однако, при создании продуктов такого типа важно учитывать его «одноразовость» что может быть решено с дополнительными модулями (мини-игры, обновляемый контент и т.д.)

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ


1.       Сайт научно-практических конференций [Электронный ресурс]. - Режим доступа: #"785965.files/image003.gif">

рисунок 1 - “Меню”

рисунок 2 - “Сцена№1”

рисунок 3 - “Сцена№2”

рисунок 4 - “Сцена№3”

рисунок 5 - “Сцена№4”

рисунок 6 - “Сцена№5”

рисунок 7 - “Сцена№6”

рисунок 8 - “Сцена№7”

Приложение 3

Фрагменты программного кода интерактивной книги

actionsscript.csUnityEngine;System.Collections;class actionscript : MonoBehaviour {Animator anim;int count=0;Start(){= GetComponent<Animator>();}OnMouseDown(){(Time.timeScale != 0) {(count % 2 != 0) {.SetBool ("action", true);

}(count % 2 == 0) {.SetBool ("action", false);

}++;

}

}

}.scUnityEngine;System.Collections;class lebgo : MonoBehaviour {Animator anim;

// Use this for initializationStart () {= GetComponent<Animator>();

}Update () {(GameObject.Find ("lebed1sc6").GetComponent<lebedisc6> ().go == true) {.SetBool ("action", true);

}(GameObject.Find ("lebed1sc6").GetComponent<lebedisc6> ().go == false) {.SetBool ("action", false);

}

}

}.cs.UnityEngine;System.Collections;class changetree : MonoBehaviour {int count=0;Start(){.Find ("derevo1").GetComponent<SpriteRenderer>().enabled = true;.Find ("derevo2").GetComponent<SpriteRenderer>().enabled = false;

}

// Use this for initializationOnMouseDown(){(Time.timeScale != 0) {(count % 2 != 0) {.Find ("derevo1").GetComponent<SpriteRenderer> ().enabled = false;.Find ("derevo2").GetComponent<SpriteRenderer> ().enabled = true;

}(count % 2 == 0) {.Find ("derevo1").GetComponent<SpriteRenderer> ().enabled = true;.Find ("derevo2").GetComponent<SpriteRenderer> ().enabled = false;

}++;

}

}

// Update is called once per frameUpdate () {

}

}.csUnityEngine;System.Collections;class BackgroundPropSpawner : MonoBehaviourRigidbody2D backgroundProp;// The prop to be instantiated.float upSpawnPosY;// The Y coordinate of position if it's instantiated on the left.float downSpawnPosY;// The Y coordinate of position if it's instantiated on the right.float leftSpawnPosX;// The lowest possible X coordinate of position.float rightSpawnPosX;// The highest possible X coordinate of position.float minTimeBetweenSpawns;// The shortest possible time between spawns.float maxTimeBetweenSpawns;// The longest possible time between spawns.float minSpeed;// The lowest possible speed of the prop.float maxSpeed;// The highest possible speeed of the prop.Start ()

{("Spawn");

}Spawn ()

{waitTime = Random.Range(minTimeBetweenSpawns, maxTimeBetweenSpawns);return new WaitForSeconds(waitTime);posX =Random.Range(leftSpawnPosX, rightSpawnPosX);posY = upSpawnPosY;spawnPos = new Vector3(posX , posY,transform.position.z );D propInstance = Instantiate(backgroundProp, spawnPos, Quaternion.identity) as Rigidbody2D;scale = propInstance.transform.localScale;.y *= -1;.transform.localScale = scale;speed = Random.Range(minSpeed, maxSpeed);*= -1f;.velocity = new Vector2(0,speed);(Spawn());(propInstance != null)

{(propInstance.transform.position.y < downSpawnPosY - 0.5f)(propInstance.gameObject);return null;

}

}

}.csUnityEngine;System.Collections;UnityEngine.UI;class EndScoreAchG2 : MonoBehaviour {int language ;text;

// Use this for initializationStart () {.HasKey ("Language");= PlayerPrefs.GetInt ("Language");= GetComponent<Text> ();

}

// Update is called once per frameUpdate () {= GetComponent<Text> ();(0<startScoreG2.score && 11>startScoreG2.score) {(language == 0) {.text = "Try Again";

}(language == 1) {.text = "Попробуй еще";

}

}(startScoreG2.score > 10 &&21>startScoreG2.score) {(language == 0) {.text = "Good";

}(language == 1) {.text = "Хорошо";

}

}(startScoreG2.score > 25) {(language == 0) {.text = "Excellent";

}(language == 1) {.text = "Умничка";

}}

}

}.csUnityEngine;System.Collections;Assets.Scripts;UnityEngine.UI;class Game : MonoBehaviour

{float fromleft;float ratio;int index;text;

// Use this for initializationStart()

{(Screen.width == 1024 && Screen.height == 768&& Screen.height > 650) {= 0.272f;= 0.09f;

}if (Screen.width == 800 && Screen.height == 480) {= 0.218f;= 0.176f;

}if (Screen.width == 960 && Screen.height == 540) {= 0.206f;= 0.192f;

}if (Screen.width == 1280 && Screen.height< 801 && Screen.height> 720) {= 0.210f;= 0.186f;

}if (Screen.width == 854 && Screen.height == 480) {= 0.205f;= 0.192f;

}{= 0.205f;= 0.19f;

//random blank piece= Random.Range (0, Constants.MaxSize);[index].SetActive (false);

//get the objects from the 1D array,

//convert them to Piece class and

//place them in a 2D array(int i = 0; i < Constants.MaxColumns; i++) {(int j = 0; j < Constants.MaxRows; j++) {(go [i * Constants.MaxColumns + j].activeInHierarchy) {point = GetScreenCoordinatesFromVieport (i, j);[i * Constants.MaxColumns + j].transform.position = point;

//place relevant information[i, j] = new Piece ();[i, j].GameObject = go [i * Constants.MaxColumns + j];[i, j].OriginalI = i;[i, j].OriginalJ = j;

//add a box collider the the raycast to work properly(Matrix [i, j].GameObject.GetComponent<BoxCollider2D> () == null)[i, j].GameObject.AddComponent<BoxCollider2D> ();

} else {[i, j] = null; //this will be our "empty" object

}

}

}

}void Shuffle()

{

//shuffle(int i = 0; i < Constants.MaxColumns; i++)

{(int j = 0; j < Constants.MaxRows; j++)

{(Matrix[i, j] == null) continue;random_i = Random.Range(0, Constants.MaxColumns);random_j = Random.Range(0, Constants.MaxRows);

//swap'em(i, j, random_i, random_j);

}

}

}void Swap(int i, int j, int random_i, int random_j)

{

//temp piece, necessary for swappingtemp = Matrix [i, j];[i, j] = Matrix [random_i, random_j];[random_i, random_j] = temp;

//set the correct positions to both objects(Matrix [i, j] != null)[i, j].GameObject.transform.position = GetScreenCoordinatesFromVieport (i, j);[random_i, random_j].GameObject.transform.position

= GetScreenCoordinatesFromVieport (random_i, random_j);

//set the required properties(Matrix [i, j] != null) {[i, j].CurrentI = i;[i, j].CurrentJ = j;

}[random_i, random_j].CurrentI = random_i;[random_i, random_j].CurrentJ = random_j;

}

// Update is called once per frameUpdate()

{(gameState)

{GameState.Start:(Input.GetMouseButtonUp(0) )

{();= GameState.Playing;

};GameState.Playing:();;GameState.Animating:(PieceToAnimate, Time.deltaTime);();;GameState.End:= GetComponent<Text> ();.Find("puzzleend").GetComponent<Text> ().enabled=true;(Input.GetMouseButtonUp(0))

{ //reload.LoadLevel(Application.loadedLevel);

};:;

}

}CheckPieceInput()

{(Input.GetMouseButtonUp (0) ) {ray = Camera.main.ScreenPointToRay (Input.mousePosition);D hit = Physics2D.Raycast (ray.origin, ray.direction);

//check if a piece was hit(hit.collider != null) {name = hit.collider.gameObject.name;[] parts = name.Split ('-');iPart = int.Parse (parts [1]);jPart = int.Parse (parts [2]);iFound = -1, jFound = -1;

//find which one was hit, in our 2D array

//there must be a better way than this one(int i = 0; i < Constants.MaxColumns; i++) {(iFound != -1);(int j = 0; j < Constants.MaxRows; j++) {(iFound != -1);(Matrix [i, j] == null);(Matrix [i, j].OriginalI == iPart

&& Matrix [i, j].OriginalJ == jPart) {= i;= j;

}

}

}foundPiece = Matrix [iFound, jFound];

//check for the null piece, taking into account the game boundspieceFound = false;(iFound > 0 && Matrix [iFound - 1, jFound] == null) {= true;= iFound - 1;= jFound;

} else if (jFound > 0 && Matrix [iFound, jFound - 1] == null) {= true;= iFound;= jFound - 1;

} else if (iFound < Constants.MaxColumns - 1 && Matrix [iFound + 1, jFound] == null) {= true;= iFound + 1;= jFound;

} else if (jFound < Constants.MaxRows - 1 && Matrix [iFound, jFound + 1] == null) {= true;= iFound;= jFound + 1;

}(pieceFound) {

//get the coordinates of the empty object= GetScreenCoordinatesFromVieport (toAnimateI, toAnimateJ);= Matrix [iFound, jFound];= GameState.Animating;

}

}

}

}void AnimateMovement(Piece toMove, float time)

{

//animate it

//Lerp could also be used, but I prefer the MoveTowards approach :).GameObject.transform.position = Vector2.MoveTowards(toMove.GameObject.transform.position,, time * AnimSpeed);

}

/// <summary>

/// A simple check to see if the animation has finished

/// </summary>void CheckIfAnimationEnded()

{(Vector2.Distance(PieceToAnimate.GameObject.transform.position,) < 0.1f)

{

//make sure they swap, exchange positions and stuff(PieceToAnimate.CurrentI, PieceToAnimate.CurrentJ, toAnimateI, toAnimateJ);= GameState.Playing;

//check if the use has won();

}

}void CheckForVictory()

{(int i = 0; i < Constants.MaxColumns; i++)

{(int j = 0; j < Constants.MaxRows; j++)

{(Matrix[i, j] == null) continue;((Matrix[i, j].CurrentJ != Matrix[i, j].OriginalJ)||(Matrix[i, j].CurrentI != Matrix[i, j].OriginalI)) return;

//at least one wrong piece, so we haven't won (yet!)

}(index);

//go [index].SetActive (true);= GameState.End;

}Vector3 GetScreenCoordinatesFromVieport(int i, int j)

{point = Camera.main.ViewportToWorldPoint (new Vector3 (ratio*j+fromleft, 1f-0.205f * i - 0.2f, 0));.z = 0;point;

}screenPositionToAnimate;Piece PieceToAnimate;int toAnimateI, toAnimateJ;Piece[,] Matrix = new Piece[Constants.MaxColumns, Constants.MaxRows];GameState gameState;GameObject[] go;float AnimSpeed = 10f;

}

Источник: https://www.bibliofond.ru/detail.aspx?id=785965