Создание 3D игры на Unity / Урок #6 – Выбор игровых объектов

preview_player
Показать описание
Главная функция всех игр в жанре стратегии – выборка игровых объектов. За урок вы научитесь создавать активную область и за ее счет сможете выбирать машинки и управлять ими.

✅ Полезные ссылки:

⏰ Тайм-коды:
00:00 - Начало
00:18 - Что мы будем делать?
01:50 - Написание C# скрипта
03:45 - Создание куба через скрипт
07:50 - Удаление куба со сцены
10:00 - Трансформация куба в размерах
15:50 - Увеличение размеров через скрипт
20:45 - Добавление материала
22:30 - Работа с машинками
23:25 - Выборка машин
31:00 - Устранение ошибок
36:10 - Заключительная часть

✔ -------------

- Уроки от #itProger 👨🏼‍💻
- Все уроки по хештегу #itprogerLessons
Рекомендации по теме
Комментарии
Автор

Я делал что было показано в видео около 3~4 часов, но я остался очень доволен результатом!
Спасибо!

koyoulaylay
Автор

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SelectController : MonoBehaviour
{

public GameObject cube;
public List<GameObject> players;
public LayerMask layer, LayerMask;
private Camera _cam;
private GameObject _cubeSelection;
private RaycastHit _hit;

private void Awake() {
_cam = GetComponent<Camera>();
}

private void Update() {
if (Input.GetMouseButtonDown(0)) {

players.Clear();

Ray ray =

if (Physics.Raycast(ray, out _hit, 1000f, layer))
_cubeSelection = Instantiate(cube, new Vector3(_hit.point.x, 1, _hit.point.z), Quaternion.identity);


}

if(_cubeSelection)
{
Ray ray =

if (Physics.Raycast(ray, out RaycastHit hitDrag, 1000f, layer))
{

float xScale = (_hit.point.x - hitDrag.point.x) * -1 ;
float zScale = _hit.point.z - hitDrag.point.z;

if(xScale < 0.0f && zScale < 0.0f)
= Quaternion.Euler(new Vector3(0, 180, 0));
else if(xScale < 0.0f )
= Quaternion.Euler(new Vector3(0, 0, 180));
else if(zScale < 0.0f)
= Quaternion.Euler(new Vector3(180, 0, 0));
else
= Quaternion.Euler(new Vector3(0, 0, 0));


= new Vector3(Mathf.Abs(xScale), 1, Mathf.Abs(zScale));
}
}

if (Input.GetMouseButtonUp(0) && _cubeSelection)
{
RaycastHit[] hits = Physics.BoxCastAll(
_cubeSelection.transform.position,
_cubeSelection.transform.localScale,
Vector3.up,
Quaternion.identity,
0,
LayerMask
);

foreach (var el in hits)
{

}

Destroy(_cubeSelection);
}

}


}

Cortez-bolq
Автор

Аргументы метода BoxCastAll в данном случае правильнее будут выглядеть так:

RaycastHit[] hits = Physics.BoxCastAll(
_cubeSelection.transform.GetChild(0).position,
_cubeSelection.transform.localScale/2,
Vector3.up,
Quaternion.identity,
0,
layerMask
);

Если захват представить одной четвертью координатной плоскости, то в таком случае захват будет происходить только в этой четверти.
Если аргументы будут как в видео, то рейкаст будет по всем четырем четвертям плоскости.
Наш SelectionCube расположен совсем в другой позиции, чем его наследник Cube.

Второй аргумент должен быть поделен на 2, так как BoxCastAll вторым аргументом принимает половину размера.

ASh-zy
Автор

Если у вас при выделении пустой области выделяются машинки и/или в консоли вылетают непонятные ошибки, то, чтобы это исправить нужно в параметрах Physics.BoxCastAll поменять первый и второй параметры на и / 2 соответственно. У вас должно получится примерно следующее:
RaycastHit[] hits = Physics.BoxCastAll(
_cubeSelection.transform.GetChild(0).transform.position,
/ 2,
Vector3.down,
Quaternion.identity,
0,
layerMask);

Yoshkin_Kit
Автор

Подскажите кто сможет: на 13:51 минуте нам нужно дочерний объект "cube" двинуть в сторону, чтобы координаты родительского элемента были в начале "cube". Так вот когда я двигаю дочерний объект, вместе с ним сдвигается родительский. Как это поправить?

Alexeybiron
Автор

я сделал огромное тебе спасибо после куплю у тебя курсы
ты супер братан

LegionDGamers
Автор

вот рабочий код, то что выше по коду всё тоже самое как в видео:

if (_cubeSelection)
{
Ray ray =



if (Physics.Raycast(ray, out RaycastHit hitDrag, 1000f, layer))
{
float xScale = (_hit.point.x - hitDrag.point.x) * -1;
float zScale = _hit.point.z - hitDrag.point.z;

= new Vector3(xScale, 1, zScale);
}

}

if (Input.GetMouseButtonUp(0) && _cubeSelection)
{
Vector3 startPosition =
Ray rayEnd =
if (Physics.Raycast(rayEnd, out RaycastHit hitEnd, 1000f, layer))
{
Vector3 endPosition = new Vector3(hitEnd.point.x, 1, hitEnd.point.z);
Vector3 centerPosition = (startPosition + endPosition) / 2;
Vector3 size = new - endPosition.x), 1, Mathf.Abs(startPosition.z - endPosition.z));

Collider[] colliders = Physics.OverlapBox(centerPosition, size / 2, Quaternion.identity, layerMask);

foreach (var collider in colliders)
{

}
}

Destroy(_cubeSelection);
}

scorp
Автор

3:23
У меня не добавляется скрипт к объекту и вылезает ошибка: "Невозможно добавить компонент сценария SelectController, поскольку не найден класс сценария. Убедитесь, что нет ошибок компиляции и что имя файла и имя класса совпадают."

Она пропадает если сделать метод awake публичным, но как сделать его приватным и добавить объект к камере?

gamelol
Автор

На 34 минуте нужно обьяснение! Почему Box collider не принимает отрицательные значения? Почему кроме Abs (модуля) использовали вращение? Зачем вращать на нулевое значение?

IvanTV-pdvk
Автор

Куб выбора расширяется за курсором, но выборка объектов происходит и в зеркальном направлении тоже :(

displesher-_-
Автор

Зеркально выбирает объекты, что делать?

KoshkaStepnaya
Автор

У меня конечная точка выделения появляется сразу же после зажатия лкм и появляется в не правильном месте. и когда двигаю мышкой то оно двигается по сути также но с огромным оффсетом от самой мышки

nucearant
Автор

При смещении дочернего куба так же смещается и родительский пустой обЪект.... кто сталкивался с таким?

playingJokerx
Автор

У меня кубы зависают в воздухе с тайм кода 7:32

origamiboy
Автор

сделал всё как на видео, но почему-то машины не записываются в список

mrcroissant
Автор

4:00 забавно что никто это не заметил что он говорит одно, а пишет другое, говорит 1 а пишет 0
И это получается на левую кнопку это не плохо, но сам факт того, что аж мозг затупил где лево, а где право

aaffa-ckvd
Автор

а почему ты везде говоришь правую клавишу, потом говоришь ОДИН а пишешь 0, ...

looneykoldyin
Автор

Пф, интересный баг:
Этот куб либо коллизит машины, либо если убрать бокс коллайдер/поморочиться с взаимодействием слоёв— обязательно получим то, что селектор со временем прекратит выделять машины💪👍

smash
Автор

Если плоскость поднять или делать выделение объектов уже на поднятом плейне то выделение работать не будет

Inemir
Автор

спасибо за урок), есть странная штука когда в пустой объект помещаю куб то центр координат показывает в центре куба)

justMarcusTheLight