Страница 1 из 2

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

СообщениеДобавлено: 15 июн 2020, 12:37
Nikkolian
Всем Привет!
Есть проблема, которую не получается решить несколько недель.
Гуглил, но так и не нашел то что мне нужно.
В общем есть один скрипт (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;
}
}
 


Подскажите, как мне решить проблему?

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

СообщениеДобавлено: 15 июн 2020, 12:41
Woland
Используй наследование

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

СообщениеДобавлено: 15 июн 2020, 13:16
Nikkolian
Woland писал(а):Используй наследование


Наследование чего?
Напиши пример, если не трудно

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

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

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

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

СообщениеДобавлено: 15 июн 2020, 15:21
Nikkolian
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>() ;
}
}
 


в моём коде даже нет смысла наследования)

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

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

говорит о том, что Вы его не знаете.

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

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

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

СообщениеДобавлено: 15 июн 2020, 17:19
Tolking
Тип object позволяет присвоить значение любого типа... Ты его используешь. Что не так?

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

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

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

СообщениеДобавлено: 15 июн 2020, 19:13
Nikkolian
Tolking писал(а):Тип object позволяет присвоить значение любого типа... Ты его используешь. Что не так?


Он ссылку не запоминает, что-ли..
Ошибку выдаёт

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

СообщениеДобавлено: 15 июн 2020, 19:32
~AvA~
Я бы использовал паттерн "Команда", ну и без наследования не обойтись.. хотя бы потому что мы все наследкуемся от MonoBehaviour ( :D ), но в случае "Команда", класс должен уметь одной фукцией принять базовый класс команды и вызвать Выполнить на ней.
Ммм, но возможно, я неправильно понял чего нужно, у меня с этим всегда проблемы, как понаписывают, но сути проблемы никто не пишет, ответ на вопрос - зачем тебе нужен этот огород, что ты воротишь )

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

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


dynamic — самое то)
просто при наследовании же будет один базовый для остальных?

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

СообщениеДобавлено: 15 июн 2020, 20:34
Woland
Что один базовый?
У тебя 3 класса
Settings : MonoBeh
PlayerSettings: Settings
BlaBlaSettings: Settings

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

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

СообщениеДобавлено: 16 июн 2020, 00:16
alew
Возможно поможет:
Синтаксис:
Используется 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]);
            }
        }
    }
}

 

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

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


Ему наверное нужно показать пример работы с интерфейсами, может он этого хочет