Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Реализация скрипта Unity3d C#

Как в C# Unity3D получить переменную из другого скрипта другого объекта при столкновении? Если более конкретно, у меня есть кассета для дисков и сами диски. Дисков много, и они отличаются тем, что у них разные переменные на их личном скрипте (они отличаются друг от друга, но имена одинаковые). В скрипте самой кассеты есть массив положений возможных дисков (7 слотов). При столкновении с диском кассета проверяет его имя и количество свободных слотов. Если такой находится, она располагает его в свободном слоте и делает дочерним.

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

public class Cassete : MonoBehaviour
{
public bool EstMesto = true; //есть место
int[] Slots = { 0, 0, 0, 0, 0, 0, 0}; //слоты
    public void OnCollisionEnter(Collision other) {
        if (other.gameObject.name == "Si(Clone)") // Если касается диска
        {
            Check(); //проверяем, хватает ли мест
            if(EstMesto)
            {
                for (int i = 0; i < Slots.Length; i++)// Ищем место для пластинки
                { 
                    if (Slots[i] == 0) // если место свободно
                    {
                        Slots[i] = 1; 
                        other.transform.SetParent(gameObject.transform);
                        Debug.Log("Стал дочерним");
                        Debug.Log("Слот под номером " + i + " равен " + Slots[i]);
                    break;
                    }
                }
            }
            else 
                Debug.Log("Нет места");
        }
        }
       void Check() 
    { 
        if (Slots[0] != 0 && Slots[1] != 0 && Slots[2] != 0 && Slots[3] != 0 && Slots[4] != 0 && Slots[5] != 0 && Slots[6] != 0) // проверяем, свободна ли касетница 
            { 
                EstMesto = false; 
            } 
        else 
            {    
                EstMesto = true; 
            } 
    } 

То что я не могу сделать:

  1. Как получить в скрипт кассеты переменную диска который с ней соприкоснулся?

  2. Как достать конкретный диск из кассетницы?

  3. Как намертво привязать диск к кассетнице на свободный слот? (не могу передать в скрипт кассеты RB и BC диска который с ней соприкоснулся)

В качестве ответа подойдёт более оптимизированный алгоритм решения (подкреплённый конкретными функциями) или код.

По дате
По рейтингу
Аватар пользователя
Мастер
8мес

Как вариант: У тебя должен быть отдельный файл с данными на диске, например:

123456
 public class Disc 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
 
} 

потом у своих дисков(они же у тебя как префабы, наверняка) меняешь название на подобие Disc1, Disc2, Disc3 и т.д.

Создаешь отдельный файл DiscList в котором указываешь что за диски, что на них:

1234567891011
 public static class DiscList  
{ 
    public static List<Disc> list = new List<Disc>() 
    { 
        new Disc() 
        { 
            Name = "Disc1", 
            Description = "Длинный текст который хранит диск" 
        } 
    }; 
} 


Затем, в методе OnCollisionEnter проверяешь название диска, с которым столкнулась твоя кассетница, получаешь его имя. Затем достаешь из списка таким вот образом

1
 var discInfo = DiscList.list.Where(x => x.Name == "Disc1").FirstOrDefault();