Помогите разобраться, как работает код

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Помогите разобраться, как работает код

Сообщение ya_e 16 янв 2020, 01:35

Доброго дня!

Учусь по книжке, к коду приложен комментарий, что делает этот кусок, но непонятно, как этот код работает
Помогите пожалуйста разобраться
Суть: Создается шарик (с параметром Is Kinematic компонента Rigidbody= false) внутри Sphere Collider при нажатии на кнопку мыши. Если отпустить эту кнопку, параметру Is Kinematic присваивается значение true и он летит под воздействием силы притяжения.

[syntax=]
public GameObject prefabProjectile; //Ссылка на создаваемый префаб шарика
public float velocityMult = 8f;
public GameObject launchPoint; //Хранит в себе ссылку на пустой объект в Sphere Collider которого появляется шарик
public Vector3 launchPos; //хранит трехмерные глобальные координаты launchPoint
public GameObject projectile; //это ссылка на вновь созданный экземпляр шарика
public bool aimingMode; //проверка наличия курсора внутри Sphere Collider
private Rigidbody projectileRigidbody;

void Awake()
{
//Найдем дочерний объект с именем "шарик"(LaunchPoint) и вернем его компонент Transform
Transform launchPointTrans = transform.Find("LaunchPoint");
//Получаем игровой объект LaunchPoint, владеющий компонентом Transform и сохраняем ссылку в launchPoint
launchPoint = launchPointTrans.gameObject;
launchPoint.SetActive(false);
launchPos = launchPointTrans.position;
}
void OnMouseEnter()
{
launchPoint.SetActive(true);
}
void OnMouseExit()
{
launchPoint.SetActive(false);
}
void OnMouseDown()
{
//Игрок нажал кнопку мыши, когда курсор находился над рогаткой
aimingMode = true;
//Создать снаряд
projectile = Instantiate(prefabProjectile) as GameObject;
//Поместить в точку launchPoint
projectile.transform.position = launchPos;
//Сделать его кинематическим
projectileRigidbody = projectile.GetComponent<Rigidbody>();
projectileRigidbody.isKinematic = true;
}

void Update()
{
//Если курсор отсутствует в радиусе Sphere Collider, следующий код не выполнять
if (!aimingMode) return;

//Получить текущие экранные координаты указателя мышки
Vector3 mousePos2D = Input.mousePosition;
mousePos2D.z = -Camera.main.transform.position.z;
Vector3 mousePos3D = Camera.main.ScreenToWorldPoint(mousePos2D);

//Найти разность координат между launchPos и mousePos3D
Vector3 mouseDelta = mousePos3D - launchPos;

//Ограничить mouseDelta радиусом Sphere Collider
float maxMagnitude = this.GetComponent<SphereCollider>().radius;
if (mouseDelta.magnitude > maxMagnitude)
{
mouseDelta.Normalize();
mouseDelta *= maxMagnitude;
}

//Переместить шарик в новую позицию
Vector3 projPos = launchPos + mouseDelta;
projectile.transform.position = projPos;
if(Input.GetMouseButtonUp(0))
{
//Кнопка мыши отпущена
aimingMode = false;
projectileRigidbody.isKinematic = false;
projectileRigidbody.velocity = -mouseDelta * velocityMult;
projectile = null;
}

}
[/syntax]

Из кода не понятно:
Что делает эта строчка ? - launchPoint = launchPointTrans.gameObject;
Для чего используется [as GameObject] в этой строчке - Instantiate(prefabProjectile) as GameObject;
Зачем находится разность координат ? Что это дает ? - Vector3 mouseDelta = mousePos3D - launchPos;
Что делает следующий блок :
if (mouseDelta.magnitude > maxMagnitude)
{
mouseDelta.Normalize();
mouseDelta *= maxMagnitude;
}
Как работает эта строчка ? - Vector3 projPos = launchPos + mouseDelta;
Что делает эта строчка ? - projectileRigidbody.velocity = -mouseDelta * velocityMult;
ya_e
UNец
 
Сообщения: 1
Зарегистрирован: 16 янв 2020, 00:32

Re: Помогите разобраться, как работает код

Сообщение Dio5555 21 янв 2020, 13:46

Я так понял, это ерундовина спавнищая шарики на шарике, =) при зажатой кнопке, эта хрень позволяет заспавнещему шарику перемещаться по позиции LaunchPoint =)
Бред какой-то

launchPoint = launchPointTrans.gameObject;

это точка куда шарики буду спавница, она должна быть дочерней того объекта, на котором висит скрипт и называться LaunchPoint и на ней должен висеть Sphere колайдер

Для чего используется [as GameObject] в этой строчке - Instantiate(prefabProjectile) as GameObject;

На счёт этого без понятие =) но Instantiate(prefabProjectile) as GameObject; это спавн твоего объекта в мир то есть Sphere

Зачем находится разность координат ? Что это дает ? - Vector3 mouseDelta = mousePos3D - launchPos;

Как я понял что бы шарик перемещался по позиции LaunchPoint во время зажима мыши

Что делает следующий блок :
if (mouseDelta.magnitude > maxMagnitude)
{
mouseDelta.Normalize();
mouseDelta *= maxMagnitude;
}

Выполняет расчёт координат что-бы "шарику перемещаться по позиции LaunchPoint "

Как работает эта строчка ? - Vector3 projPos = launchPos + mouseDelta;
Что делает эта строчка ? - projectileRigidbody.velocity = -mouseDelta * velocityMult;

А это твоё дом задание: берёшь Debug.Log( ВСТАВЛЯЕШЬ СЮДА ПЕРЕМЕННУЮ ИЛИ Объект ); и дебажишь и всё потом сам поймёшь =) что за что отвечает =)

И ещё, данный код спавнит ошибку в начале иза того, что данные небыли получены, но после нажатия всё ок.
Dio5555
UNIт
 
Сообщения: 83
Зарегистрирован: 06 сен 2018, 11:05


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: wasp и гости: 18