Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Иван Курочкин Ученик (233), открыт 2 недели назад
Как в C# Unity3D получить переменную из другого скрипта другого объекта при столкновении? Если более конкретно, у меня есть кассета для дисков и сами диски. Дисков много, и они отличаются тем, что у них разные переменные на их личном скрипте (они отличаются друг от друга, но имена одинаковые). В скрипте самой кассеты есть массив положений возможных дисков (7 слотов). При столкновении с диском кассета проверяет его имя и количество свободных слотов. Если такой находится, она располагает его в свободном слоте и делает дочерним.
 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 диска который с ней соприкоснулся)
В качестве ответа подойдёт более оптимизированный алгоритм решения (подкреплённый конкретными функциями) или код.
1 ответ
[ ] [ ] Мастер (1178) 2 недели назад
Как вариант: У тебя должен быть отдельный файл с данными на диске, например:

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

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

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

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

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

 var discInfo = DiscList.list.Where(x => x.Name == "Disc1").FirstOrDefault(); 
Похожие вопросы