Не могу понять, как применить OnColliderStay и OnColliderExi

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

Не могу понять, как применить OnColliderStay и OnColliderExi

Сообщение Amfetamin11 12 май 2022, 20:00

Доброго времени суток, форум.

Делаю игру для диплома по книжке 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);
)



И будет ли он работать так, как задумано(сбрасывать старую точку привязки к снаряду и привязывать к только что созданному)? Спасибо.
Если что-то не понятно в той тарабарщине, что я написал - прошу уточнить. Постараюсь дать развёрнутый ответ.


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);
        }
 
    }
 
}




P.P.S.: Ещё буду благодарен, если посоветуете литературу по теме. Даже буржуйскую.
Amfetamin11
UNец
 
Сообщения: 6
Зарегистрирован: 03 май 2022, 18:57

Re: Не могу понять, как применить OnColliderStay и OnColliderExi

Сообщение 1max1 12 май 2022, 20:30

Ты же где-то запускаешь снаряд, вот в том месте обнуляй лр.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Не могу понять, как применить OnColliderStay и OnColliderExi

Сообщение Amfetamin11 12 май 2022, 21:30

1max1 писал(а):Ты же где-то запускаешь снаряд, вот в том месте обнуляй лр.


Туплю. Может я просто неправильно понимаю как "обнулять"? Можно, пожалуйста, пример?
Сейчас перенёс код в другой скрипт, где происходит создание снаряда и запуск. Вроде всё по-старому работает.
Видимо что-то не так пишу. Или даже недописываю.


Синтаксис:
Используется csharp
public void OnMouseDown()
    {
        aimingMode = true;
        projectile = Instantiate(prefabProjectile) as GameObject;
        projectile.transform.position = launchPos;
        projectile.GetComponent<Rigidbody>().isKinematic = true;
        projectileRigidbody = projectile.GetComponent<Rigidbody>();
        projectileRigidbody.isKinematic = true;

        rubberPos.GetComponent<LineRenderer>().positionCount = 3;
        rubberPos.pointSecond = GameObject.FindGameObjectWithTag("ProjBorder").transform.position;
        //pointThird = GameObject.FindGameObjectWithTag("ProjBorderS").transform.position;
        rubberPos.GetComponent<LineRenderer>().SetPosition(0, rubberPos.pointFirst);
        rubberPos.GetComponent<LineRenderer>().SetPosition(1, rubberPos.pointSecond);
        rubberPos.GetComponent<LineRenderer>().SetPosition(2, rubberPos.pointFour);

    }


Синтаксис:
Используется csharp
//Передвинуть снаряд в новую позицию
        projPos = launchPos + mouseDelta;
        projectile.transform.position = projPos;
        if (Input.GetMouseButtonUp(0))
        {
            aimingMode = false;
            projectileRigidbody.isKinematic = false;
            projectileRigidbody.velocity = -mouseDelta * velocityMult;
            CamFollow.POI = projectile;
            projectile = null;

            rubberPos.GetComponent<LineRenderer>().SetPosition(1, Vector3.zero);
            rubberPos.GetComponent<LineRenderer>().positionCount = 2;
            rubberPos.GetComponent<LineRenderer>().SetPosition(0, rubberPos.pointFirst);
            rubberPos.GetComponent<LineRenderer>().SetPosition(1, rubberPos.pointFour);
           
        }
Amfetamin11
UNец
 
Сообщения: 6
Зарегистрирован: 03 май 2022, 18:57

Re: Не могу понять, как применить OnColliderStay и OnColliderExi

Сообщение Amfetamin11 13 май 2022, 00:36

В общем, решил проблему вот так:

Синтаксис:
Используется csharp
rubberPos.GetComponent<LineRenderer>().positionCount = 3;
rubberPos.pointSecond = projectile.transform.Find("BorderL").transform.position;
rubberPos.GetComponent<LineRenderer>().SetPosition(0, rubberPos.pointFirst);
rubberPos.GetComponent<LineRenderer>().SetPosition(1, rubberPos.pointSecond);
rubberPos.GetComponent<LineRenderer>().SetPosition(2, rubberPos.pointFour);


Изначально у меня была запись

Синтаксис:
Используется csharp
rubberPos.pointSecond = GameObject.FindGameObjectWithTag("ProjBorder").transform.position;


Она искала объект по тэгу и присваивало переменной pointSecond его позицию. Я так понимаю, что поиск по тэгу - понятие обширное, поэтому по тэгу он объект нашёл и запомнил. Выкидывать из памяти он его не хотел, судя по всему, т.к. объект был в сцене и никуда не исчезал.
Я случайно это заметил и решил, что нужно искать не по тэгу, а сразу по названию дочернего объекта, через ссылку на родительский объект.

Не совсем понимаю как это работает, если честно)))
Кстати, был бы благодарен, если бы кто объяснил как быть, в случае если объектов несколько, тэг общий, а присваивать значения нужно только тому объекту, который появился последним.
Amfetamin11
UNец
 
Сообщения: 6
Зарегистрирован: 03 май 2022, 18:57

Re: Не могу понять, как применить OnColliderStay и OnColliderExi

Сообщение Amfetamin11 13 май 2022, 00:38

Но вообще, вопрос остаётся актуальным.
Можно ли здесь было применить OnColliderStay и OnColliderExit(или OnTriggerStay, OnTriggerExit)?
Если да, то большая просьба объяснить как.
Amfetamin11
UNец
 
Сообщения: 6
Зарегистрирован: 03 май 2022, 18:57


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29