Универсальный ссылочный тип

Программирование на Юнити.

Универсальный ссылочный тип

Сообщение Nikkolian 15 июн 2020, 12:37

Всем Привет!
Есть проблема, которую не получается решить несколько недель.
Гуглил, но так и не нашел то что мне нужно.
В общем есть один скрипт (Person_Controller), который висит на main Камере, и есть множество экземпляров разных классов (_settings) на разных объектах
(human_settings, humanoid_settings и тп...)
Мне нужно заносить в переменную player_setting класса Person_Controller классы тех экземпляров, как бы подключаясь к объектам "на лету".

сейчас использую это:
Синтаксис:
Используется csharp
public class Person_Controller: MonoBehaviour
{
public GameObject Player;
<span style="font-weight: bold">public human_settings human_setting;</span>
<span style="font-weight: bold">public humanoid_settings humanoid_setting;</span>

public string TAG;

void Awake()
{
Components();
TagsPlayer();
}

void Components()
{
TAG = Player.tag;
......
}

void TagsPlayer()
{
switch (TAG)
case "human":
human_setting = Player.GetComponent<human_settings>();
break;
case "humanoid":
humanoid_setting = Player.GetComponent<humanoid_settings>();
break;
}

}
 


и так везде в коде, где обращаюсь к _settings экземпляров и к другим их скриптам через _settings типо:
Синтаксис:
Используется csharp

void FixedUpdate()
{
if (Input.GetAxis("Vertical")
{
switch (TAG)
{
case "human":
human_setting.my_controller.Movement = true;
break;

case "humanoid":
humanoid_setting.my_controller.Movement = true;
break;
}
}
}
 

но ведь тегов может быть десятки..

Наверняка можно проще)
что-то вроде:
Синтаксис:
Используется csharp
public class Person_Controller: MonoBehaviour
{
public GameObject Player;
public <span style="font-weight: bold">object player_setting;</span>
public string TAG;

void Awake()
{
Components();
TagsPlayer();
}

void Components()
{
TAG = Player.tag;
......
}

void TagsPlayer()
{
switch (TAG)
{
case "human":
player_setting= Player.GetComponent<human_settings>();
break;
case "humanoid":
player_setting= Player.GetComponent<humanoid_settings>();
break;
}
}

void FixedUpdate()
{
if (Input.GetAxis("Vertical")
{
player_setting.my_controller.Movement = true;
}
}
 


Подскажите, как мне решить проблему?
Nikkolian
UNец
 
Сообщения: 10
Зарегистрирован: 15 июн 2020, 11:10

Re: Универсальный ссылочный тип

Сообщение Woland 15 июн 2020, 12:41

Используй наследование
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Универсальный ссылочный тип

Сообщение Nikkolian 15 июн 2020, 13:16

Woland писал(а):Используй наследование


Наследование чего?
Напиши пример, если не трудно
Nikkolian
UNец
 
Сообщения: 10
Зарегистрирован: 15 июн 2020, 11:10

Re: Универсальный ссылочный тип

Сообщение Woland 15 июн 2020, 14:05

Наследование классов. Делаешь класс settings (наследуешь от MonoBeh), наследуешь от него все свои производные классы (другие settings).
Потом пишешь
Синтаксис:
Используется csharp
Settings mySettings=this.GetComponent<PlayerSettings>();

Если не знаешь про наследование, погугли, это важная и довольно объемная тема, на пальцах не объяснишь.
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Универсальный ссылочный тип

Сообщение Nikkolian 15 июн 2020, 15:21

Woland писал(а):Наследование классов. Делаешь класс settings (наследуешь от MonoBeh), наследуешь от него все свои производные классы (другие settings).
Потом пишешь
Синтаксис:
Используется csharp
Settings mySettings=this.GetComponent<PlayerSettings>();

Если не знаешь про наследование, погугли, это важная и довольно объемная тема, на пальцах не объяснишь.


Я тебя наверное не правильно понял, а может я не понятно описал что мне нужно)
Но даже с наследованием не получается..
Синтаксис:
Используется csharp
public class Person_Controller: MonoBehaviour
{
public type_definition TD;
 
void Start()
{
TD = GetComponent<type_definition>() ;
}
void FixedUpdate()
{
TD.my_setting.???//нет ссылки на нужный скрипт
}
}

public class type_definition : MonoBehaviour
{
public object my_settings;
}

public class humanoid_settings: type_definition
{
public type_definition TD;
public float health = 1000;
public float magic = 300;

void Awake((
{
TD = GetComponent<type_definition>() ;
TD.my_settings = GetComponent<humanoid_settings>() ;
}
}

public class human_settings: type_definition
{
public type_definition TD;
public float health = 200;

void Awake((
{
TD = GetComponent<type_definition>() ;
TD.my_settings = GetComponent<human_settings>() ;
}
}
 


в моём коде даже нет смысла наследования)
Nikkolian
UNец
 
Сообщения: 10
Зарегистрирован: 15 июн 2020, 11:10

Re: Универсальный ссылочный тип

Сообщение seaman 15 июн 2020, 15:35

Вы бы все же почитали что-то про наследование. Потому как вот это:
Синтаксис:
Используется csharp
public class humanoid_settings: type_definition
{
public type_definition TD;

говорит о том, что Вы его не знаете.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Универсальный ссылочный тип

Сообщение Nikkolian 15 июн 2020, 17:03

В общем до меня так и не дошло, зачем использовать наследование, если скрипты разные и висят на разный объектах..
мне лишь нужен тип, который позволит перезаписывать переменную под любой скрипт "на лету"
Nikkolian
UNец
 
Сообщения: 10
Зарегистрирован: 15 июн 2020, 11:10

Re: Универсальный ссылочный тип

Сообщение Tolking 15 июн 2020, 17:19

Тип object позволяет присвоить значение любого типа... Ты его используешь. Что не так?
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2715
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Универсальный ссылочный тип

Сообщение 1max1 15 июн 2020, 18:08

Тип object надо кастить к другому типу по тому же тегу)))
Наследование здесь как раз уместно, универсальный тип с общими переменными для всех классов, которые от него унаследуются.
Но есть еще одна очень ужасная вещь https://metanit.com/sharp/tutorial/9.1.php
Но будь осторожен, производительности может прийти пиздец, а на некоторых платформах это вообще не работает.
Edit > Project Settings > Player > Scripting Runtime Version надо поставить на 4.x
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Универсальный ссылочный тип

Сообщение Nikkolian 15 июн 2020, 19:13

Tolking писал(а):Тип object позволяет присвоить значение любого типа... Ты его используешь. Что не так?


Он ссылку не запоминает, что-ли..
Ошибку выдаёт
Nikkolian
UNец
 
Сообщения: 10
Зарегистрирован: 15 июн 2020, 11:10

Re: Универсальный ссылочный тип

Сообщение ~AvA~ 15 июн 2020, 19:32

Я бы использовал паттерн "Команда", ну и без наследования не обойтись.. хотя бы потому что мы все наследкуемся от MonoBehaviour ( :D ), но в случае "Команда", класс должен уметь одной фукцией принять базовый класс команды и вызвать Выполнить на ней.
Ммм, но возможно, я неправильно понял чего нужно, у меня с этим всегда проблемы, как понаписывают, но сути проблемы никто не пишет, ответ на вопрос - зачем тебе нужен этот огород, что ты воротишь )
Аватара пользователя
~AvA~
UNIверсал
 
Сообщения: 396
Зарегистрирован: 17 фев 2015, 13:09

Re: Универсальный ссылочный тип

Сообщение Nikkolian 15 июн 2020, 20:22

1max1 писал(а):Тип object надо кастить к другому типу по тому же тегу)))
Наследование здесь как раз уместно, универсальный тип с общими переменными для всех классов, которые от него унаследуются.
Но есть еще одна очень ужасная вещь https://metanit.com/sharp/tutorial/9.1.php
Но будь осторожен, производительности может прийти пиздец, а на некоторых платформах это вообще не работает.
Edit > Project Settings > Player > Scripting Runtime Version надо поставить на 4.x


dynamic — самое то)
просто при наследовании же будет один базовый для остальных?
Nikkolian
UNец
 
Сообщения: 10
Зарегистрирован: 15 июн 2020, 11:10

Re: Универсальный ссылочный тип

Сообщение Woland 15 июн 2020, 20:34

Что один базовый?
У тебя 3 класса
Settings : MonoBeh
PlayerSettings: Settings
BlaBlaSettings: Settings

В Settings пишешь какой-нибудь виртуальный метод, в производных классах переопределяешь его.
Потом ты получаешь нужный тебе компонент, запоминаешь его в Settings mySettings и вызываешь этот переопределенный метод (или что там тебе надо). Вот и все
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Универсальный ссылочный тип

Сообщение alew 16 июн 2020, 00:16

Возможно поможет:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class fingObject : MonoBehaviour
{
    public int allGameObjects;
    public int gameObjectWithBoxCollaider;
    public int gameObjectWithCircleCollaider;
    public int gameObjectWithPoligonCollaider;
    public GameObject[] arrayGameObjects;
    public List<int> listID = new List<int>();
   
    void Update()
    {
        arrayGameObjects = FindObjectsOfType<GameObject>();
        allGameObjects = arrayGameObjects.Length;
        var b = FindObjectsOfType<BoxCollider2D>();
        gameObjectWithBoxCollaider = b.Length;
        var c = FindObjectsOfType<CircleCollider2D>();
        gameObjectWithCircleCollaider = c.Length;
        var d = FindObjectsOfType<PolygonCollider2D>();
        gameObjectWithPoligonCollaider = d.Length;
       
        listID.Clear();
        for (int i = 0; i < arrayGameObjects.Length; i++)
        {
            listID.Add(arrayGameObjects[i].GetInstanceID());
        }
    }
    private void OnGUI()
    {
        GUI.Window(1, new Rect(0, 0, 300, 25 + listID.Count * 25), gWindow , "select to del");
    }
    void gWindow(int winID)
    {
        for (int i = 0; i < listID.Count; i++)
        {
            if (GUILayout.Button("Name: " + arrayGameObjects[i].name.ToString() + ".  ID:"  + listID[i].ToString() ))
            {
                Destroy(arrayGameObjects[i]);
            }
        }
    }
}

 
alew
UNIт
 
Сообщения: 76
Зарегистрирован: 23 ноя 2018, 19:59

Re: Универсальный ссылочный тип

Сообщение Jarico 16 июн 2020, 14:45

Woland писал(а):Что один базовый?
В Settings пишешь какой-нибудь виртуальный метод, в производных классах переопределяешь его.
Потом ты получаешь нужный тебе компонент, запоминаешь его в Settings mySettings и вызываешь этот переопределенный метод (или что там тебе надо). Вот и все


Ему наверное нужно показать пример работы с интерфейсами, может он этого хочет
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

След.

Вернуться в Скрипты

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

Сейчас этот форум просматривают: Google [Bot] и гости: 12