Делаю игру для диплома по книжке Unity и C# от Бонда. Тема программирования на C# в Unity очень интересна, поэтому выбрал её, как основу.
Игра, по сути, клон Angry Birds.
Есть SphereCollider(ограничивает натяжение, подсвечивает область куда нужно клацать мышью, чтобы появился снаряд) в GameObject Slingshot(сама рогатка). Есть сам снаряд(projectile), который появляется при нажатии на ЛКМ.
И есть LineRenderer, в созданом специально для всего этого дела GameObject ProjectileBorder, имитирующий резинку, которая натянута между двух "рук" рогатки.
Проблема в том, что когда я задаю точки привязки LineRenderer в последовательности ПРука, снаряд, ЛРука, то они прилипают к снаряду и тянутся за ним, когда он уже запущен.
И т.к. снаряды клонируются при каждом нажатии ЛКМ, то в LineRenderer не задаётся точка для нового снаряда, а остаётся на старой. Подумал, что можно решить проблему с помощью Collider.
Такой вопрос - как можно, с помощью OnColliderStay и OnColliderExit сделать следующий код:
Синтаксис:
Используется csharp
Если projPref.projectile == null или не в коллайдере, то
(
line.positionCount = 2;
pointFirst = GameObject.FindGameObjectWithTag("RArmBorder").transform.position;
pointFour = GameObject.FindGameObjectWithTag("LArmBorder").transform.position;
line.SetPosition(0, pointFirst);
line.SetPosition(1, pointFour);
)
Если projPref.projectile находится в коллайдере, то
(
line.positionCount = 3;
pointSecond = GameObject.FindGameObjectWithTag("ProjBorder").transform.position;
pointThird = GameObject.FindGameObjectWithTag("ProjBorderS").transform.position;
line.SetPosition(0, pointFirst);
line.SetPosition(1, pointSecond);
line.SetPosition(2, pointFour);
)
(
line.positionCount = 2;
pointFirst = GameObject.FindGameObjectWithTag("RArmBorder").transform.position;
pointFour = GameObject.FindGameObjectWithTag("LArmBorder").transform.position;
line.SetPosition(0, pointFirst);
line.SetPosition(1, pointFour);
)
Если projPref.projectile находится в коллайдере, то
(
line.positionCount = 3;
pointSecond = GameObject.FindGameObjectWithTag("ProjBorder").transform.position;
pointThird = GameObject.FindGameObjectWithTag("ProjBorderS").transform.position;
line.SetPosition(0, pointFirst);
line.SetPosition(1, pointSecond);
line.SetPosition(2, pointFour);
)
И будет ли он работать так, как задумано(сбрасывать старую точку привязки к снаряду и привязывать к только что созданному)? Спасибо.
Если что-то не понятно в той тарабарщине, что я написал - прошу уточнить. Постараюсь дать развёрнутый ответ.
P.S.: Также заметил у себя другую проблему. Если задавать сразу 4 точки привязки для LineRenderer, то "резинка" исчезает по какой-то причине. Так и не нашёл в чём может быть проблема. Вдруг вы поможете?
Прикладываю код который есть сейчас:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubberLine : MonoBehaviour
{
private LineRenderer line;
private Vector3 pointFirst;
private Vector3 pointSecond;
private Vector3 pointThird; // Пока не используется.
private Vector3 pointFour;
public Slingshot projPref;
void Awake()
{
line = GetComponent<LineRenderer>();
projPref = GameObject.Find("Slingshot").GetComponent<Slingshot>();
}
void Update()
{
if (projPref.projectile == null)
{
line.positionCount = 2;
pointFirst = GameObject.FindGameObjectWithTag("RArmBorder").transform.position;
pointFour = GameObject.FindGameObjectWithTag("LArmBorder").transform.position;
line.SetPosition(0, pointFirst);
line.SetPosition(1, pointFour);
}
if (projPref.projectile != null)
{
line.positionCount = 3;
pointSecond = GameObject.FindGameObjectWithTag("ProjBorder").transform.position;
pointThird = GameObject.FindGameObjectWithTag("ProjBorderS").transform.position;
line.SetPosition(0, pointFirst);
line.SetPosition(1, pointSecond);
line.SetPosition(2, pointFour);
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class RubberLine : MonoBehaviour
{
private LineRenderer line;
private Vector3 pointFirst;
private Vector3 pointSecond;
private Vector3 pointThird; // Пока не используется.
private Vector3 pointFour;
public Slingshot projPref;
void Awake()
{
line = GetComponent<LineRenderer>();
projPref = GameObject.Find("Slingshot").GetComponent<Slingshot>();
}
void Update()
{
if (projPref.projectile == null)
{
line.positionCount = 2;
pointFirst = GameObject.FindGameObjectWithTag("RArmBorder").transform.position;
pointFour = GameObject.FindGameObjectWithTag("LArmBorder").transform.position;
line.SetPosition(0, pointFirst);
line.SetPosition(1, pointFour);
}
if (projPref.projectile != null)
{
line.positionCount = 3;
pointSecond = GameObject.FindGameObjectWithTag("ProjBorder").transform.position;
pointThird = GameObject.FindGameObjectWithTag("ProjBorderS").transform.position;
line.SetPosition(0, pointFirst);
line.SetPosition(1, pointSecond);
line.SetPosition(2, pointFour);
}
}
}
P.P.S.: Ещё буду благодарен, если посоветуете литературу по теме. Даже буржуйскую.