Практические задания с сайта unity3dstudent.com

в 14:38, , рубрики: game development, unity, unity3d, unity3dstudent, метки: , ,

Из постов DisaDisa – переводов уроков с сайта unity3dstudent – я узнал об этом интересном сайте. Помимо уроков (вполне вменяемых, хотя и не до конца логичных; например, местами повествование переходит очевидные на моменты языков программирования (javascript, в случае этих уроков), такие как циклы for или булевские выражения) там оказались ещё и так называемые “Challenges” – практические задания на применение материала из уроков. Задания сопровождаются видео-примером результата решения.
Практические задания с сайта unity3dstudent.com
Пока таких заданий всего три, но, будем надеяться, появятся ещё. Но даже только эти задания позволяют на практике ощутить простоту и удобство Unity. Разумеется, они подразумевают самостоятельное решение (ссылки на задания будут перед их решением), но если что-то вдруг не получается, можно заглянуть сюда. Ещё одна цель поста – как раз показать на примере, что можно сделать с помощью Unity с приложением минимальных усилий.

/* Для понимания статьи желательно иметь хотя бы небольшой опыт работы с Unity (особенно с пользовательским интерфейсом)– можно посмотреть пару постов от DisaDisa или первые уроки на unity3dstudent.com */

В этой статье – только про первое из заданий. Остальные — в самое ближайшее время.

Да, замечу ещё, что под формулировкой задания (видео + небольшой текст) на сайте даны ссылки на уроки, необходимые для выполнения задания.

Challenge accepted?

Первое задание

Ссылка на оригинальное задание: www.unity3dstudent.com/2010/07/challenge-c01-beginner/
Суть: создать сцену, в которой при нажатии на пробел в стенку кидается ящик, и после удара стенка исчезает.

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

Практические задания с сайта unity3dstudent.com
На скриншоте выделена камера.

Заметим, кто камера (объект MainCamera на панели Hierarchy) развёрнута так, что только что добавленной плоскости не видно (см. скриншот выше). Надо это исправить. Не зря же мы «прицеливались» к плоскости! Теперь можно выделить камеру (в панели Hierarchy или непосредственно на сцене) и нажать GameObject->Align With View (или нажать Ctrl+Shift+F). Это перенесёт камеру в ту точку пространства, из которой мы и смотрели на плоскость. Камера на месте, теперь поправим освещение. Добавим на сцену источник света Point Light и разместим где-нибудь так, чтобы сцена стала поприятнее визуально:

Практические задания с сайта unity3dstudent.com

Теперь добавим в сцену куб (назовём его wall) и растянем его до состояния стенки. Повернём/подвинем стенку так, чтобы она стояла «лицом» к камере. Эти манипуляции вызваны тем, что стрелять ящиком мы будем из точки расположения камеры «вперёд» (в кавычках, так как это достаточно относительное понятие; наш «вперёд» будет смотреть туда же, куда и камера).

Практические задания с сайта unity3dstudent.com

Со сценой почти закончили. Точнее, с видимой её частью. Ещё нам понадобится куб-префаб, которым будем стрелять. Добавим в сцену куб (можно его слегка уменьшить, если хочется), а в проект – префаб (назовём его, например, cube). Перетащим куб из панели иерархии на префаб и удалим куб из сцены – он нам больше не понадобится. Выберем в панели иерархии наш cube и добавим ему компонент Rigidbody.

Теперь можно приступать к написанию двух скриптов – скрипт Selfdestroyer будет удалять объект при ударе о него другого объекта, а скрипт Shooter будет, собственно, стрелять кубом в направлении стенки.

Создадим новый C# скрипт, назовём его Selfdestroyer. Удалим методы Update и Start из его текста – нам нужно лишь удалить объект при ударе. Описываем метод OnCollisionEnter – он будет прост до безобразия (предполагается, что ничто другое кроме ящиков нашу стенку ударять не будет):

void OnCollisionEnter()
{
	Destroy(gameObject);
}

Здесь gameObject – это объект типа GameObject, связанный с тем объектом на сцене, к которому прикреплён скрипт.

Заметим, что можно было описать функцию с прототипом void OnCollisionEnter(Collision obj) и в ней использовать информацию об объекте, ударившем объект, к которому прикреплён скрипт. Но нам это не нужно, так что оставим список формальных параметров пустым.

Перетащим из панели Project этот скрипт на объект wall в панели иерархии. Убедимся, что пока при запуске сцены ничего не происходит.

Теперь займёмся вторым скриптом – Shooter. Заведём переменную типа GameObject, которая и будет содержать тот объект, которым мы впоследствии будем стрелять в стенку:

public GameObject cubePrefab;

Здесь нам не понадобится метод Start(), а вот Update оставим и дополним так, чтобы при нажатии на пробел (это клавиша прыжка при стандартных настройках) из точки расположения объекта, к которому прикреплён скрипт (в нашем случае это будет камера) вперёд с некоторой силой бросался куб. В итоге файл скрипта будет выглядеть так:

using UnityEngine;
using System.Collections;

public class Shooter : MonoBehaviour
{
	public GameObject cubePrefab;
	// Update is called once per frame
	void Update () 
	{
		if (Input.GetButtonDown("Jump"))
		{
			GameObject cube = Instantiate(cubePrefab, transform.position, transform.rotation) as GameObject; 
			cube.rigidbody.AddForce(transform.forward * 1000);
		}
	}
}

Прикрепим скрипт к объекту MainCamera. Запустим сцену и убедимся, что … при нажатии на пробел в консоль выдаётся ошибка:

Практические задания с сайта unity3dstudent.com

Она сообщает нам, что в скрипте Shooter переменной cubePrefab не присвоено никакого значения. Исправим этот недочёт – выберем в панели иерархии объект камеры, найдем в панели Inspector раздел с названием “Shooter (Script)”. И правда, в поле “Cube Prefab” стоит значение None. Перетащим в это поле cube из панели Project.

Теперь запускаем и стреляем кубами, пока не надоест.

Итак, написав 5 содержательных строчек кода, мы имеем: сцену, реагирующую на пользовательский ввод и объект (стенку), реагирующий на «внешние раздражители» в виде соударений. Неплохо для начала.

P.S.

Вообще я собирался написать сразу про два первых задания, но статья и так уже достаточно объёмна для своего содержания, так что задания 2 и 3 будут рассмотрены в следующих статьях. Заранее замечу, в следующих задачах (в отличие от первой) будут небольшие (или не столь небольшие) дополнения к материалу уроков сайта unity3dstudent из побуждений сделать этот мир лучше статьи чуть более интересными.

Автор: MikhailS

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js