[РЕШЕНО] Сохранение адреса переменной или ссылки на неё в C#

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

[РЕШЕНО] Сохранение адреса переменной или ссылки на неё в C#

Сообщение IDoNotExist 31 авг 2011, 06:55

Здравствуйте сообщество, у меня следующий вопрос: как можно мне в глобальной переменной сохранить адрес либо ссылку на другую переменную?
Например, когда мы объявляем в скрипте какойнибудь глобальный Transform, а затем присваеваем этот Transform другой переменной, та переменная начинает ссылаться на первый Transform, тоесть:

Синтаксис:
Используется csharp
using UnityEngine;

using System.Collections;

public class SomeClass : MonoBehaviour {

  public Transform trans1;
  private Transform trans2;

  public float speed = 2.0f;

  void Awake(){

     trans1 = transform;

     trans2=trans1;
  }  

  void Update(){

      Vector3 pos = trans1.position;

      pos.x = pos.x + Time.deltaTime*speed;

      trans1.position = pos;

      Debug.Log(trans2.position.x.ToString());

  }    

}

 


A мне нужно чтобы я мог сам передать в некую переменную ссылку на другую переменную.Тоесть.

Синтаксис:
Используется csharp
using UnityEngine;

using System.Collections;

public class SomeClass : MonoBehaviour {

  public Transform trans1;
  private Transform trans2;

  public float speed = 2.0f;

  public enum Axis{
      X,
      Y,
      Z,
  }

  public Axis directionAxis = Axis.X;

  private float X;
  private float Y;
  private float Z;

  private float move;

  void Awake(){

     trans1 = transform;

     trans2=trans1;

      switch(directionAxis){
           case Axis.X:
             move = trans2.position.x;
             X = Ссылка на move;
             Y = trans2.position.y;
             Z = trans2.position.z;
           break;

           case Axis.Y:
             move = trans2.position.y;
             X = trans2.position.x;
             Y = Ссылка на move;
             Z = trans2.position.z;
           break;

           case Axis.Z:
             move = trans2.position.z;
             X = trans2.position.x;
             Y = trans2.position.y;
             Z = Ссылка на move;

           break;
        }

  }  

  void Update(){

      move = move+ Time.deltaTime*speed;

      Vector3 pos = new Vector3(X,Y,Z);

      trans1.position = pos;

      Debug.Log(move.ToString());

  }    

}
 


В Update() запихивать switch case не вариант потомучто предположительно данных объектов будет очень много и в рантайме направление по осям у них меняться не будет.

А делать это через указатели как я понял жопа, компилер ругается на unsafe поля, а чтобы использовать их в юне я так понял надо подключать какието внешние либы, подскажите есть ли более простые способы использования указателей и ссылок, либо есть ли вариант сделать это не через указатели? Вообщем чем мне можно заменить выражение "Ссылка на move" во втором скрипте?
Последний раз редактировалось IDoNotExist 31 авг 2011, 13:34, всего редактировалось 4 раз(а).
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Сохранение адреса переменной или ссылки на неё в C#

Сообщение Order 31 авг 2011, 09:22

а зачем это нужно ?

тем более на сколько я понимаю это не ссылка, а приравнивание...

почему бы не использовать переменную из другого класса на прямую ?
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Сохранение адреса переменной или ссылки на неё в C#

Сообщение IDoNotExist 31 авг 2011, 09:44

Order писал(а):а зачем это нужно ?

Я уже написал, чтобы избавиться от конструкции switch case внутри update, в том случае если хотим изменить ось.

Order писал(а):тем более на сколько я понимаю это не ссылка, а приравнивание...

тогда уж не приравнивание а присваивание, вы наверное плохо понимаете что есть ссылка, пересмотрите первый скрипт, переменная trans2 после присвоения ей trans1 ссылается на область памяти в которой собственно trans1 и расположена, это называется ссылка.

Order писал(а):почему бы не использовать переменную из другого класса на прямую ?

не понял данного предложения, неплохо было бы пример.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Сохранение адреса переменной или ссылки на неё в C#

Сообщение raul82 31 авг 2011, 10:21

как то так наверно можно реализовать сцылку:
Синтаксис:
Используется csharp
public float X
{
   get {trans2.pozition.x;}
   set {trans2.pozition.x =value;}
}
 
5 годиков 7 месяцев
Аватара пользователя
raul82
Старожил
 
Сообщения: 506
Зарегистрирован: 21 янв 2011, 17:48
Откуда: Алматы

Re: Сохранение адреса переменной или ссылки на неё в C#

Сообщение IDoNotExist 31 авг 2011, 11:23

raul82 писал(а):как то так наверно можно реализовать сцылку:
Синтаксис:
Используется csharp
public float X
{
   get {trans2.pozition.x;}
   set {trans2.pozition.x =value;}
}
 

Ну как то так я тоже умею, только get и set тут не помогут пожалуй.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Сохранение адреса переменной или ссылки на неё в C#

Сообщение Order 31 авг 2011, 12:05

так что же это будет все таки ? зачем такие сложности ?

если хотите пример, то опишите ТЗ задачи.. а то придумали мега алгоритм ссылочного типа, а для чего это нужно объяснить не можете.
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Сохранение адреса переменной или ссылки на неё в C#

Сообщение raul82 31 авг 2011, 12:21

Order писал(а):так что же это будет все таки ? зачем такие сложности ?

если хотите пример, то опишите ТЗ задачи.. а то придумали мега алгоритм ссылочного типа, а для чего это нужно объяснить не можете.

ты чио книги по СИ Кернинга и Риччи не четал?! этоже круто "указатель на указатель на указатель на указатель" :ymdevil:
5 годиков 7 месяцев
Аватара пользователя
raul82
Старожил
 
Сообщения: 506
Зарегистрирован: 21 янв 2011, 17:48
Откуда: Алматы

Re: Сохранение адреса переменной или ссылки на неё в C#

Сообщение Order 31 авг 2011, 12:43

Я все понимаю, только куски кода вырваны из контекста задачи.. а задачу можно решить по разному.

я бы сделал классы объектов с полями, и обрабатывал из в цикле, можно по флагу только подвижные.
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Сохранение адреса переменной или ссылки на неё в C#

Сообщение IDoNotExist 31 авг 2011, 13:30

Вообщем забейте, всем спс, перемудрил чето я с указателями, полазил по официальному форуму и пришел к выводу что без танцев с бубнами ссылки использовать нельзя, а задачу разрулил с помощью массива и одной int переменной.

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

public class SomeClass : MonoBehaviour {

  public Transform trans1;

  private Transform trans2;

  public float speed = 2.0f;

  public enum Axis{
      X,
      Y,
      Z,
  }

  public Axis directionAxis = Axis.X;

  public class PosAxis{
      public float[] values = { 0.0f, 0.0f, 0.0f };
      public int pointer = 0;
  }

 private PosAxis PA;

 private float move;

  void Awake(){

     trans1 = transform;

     trans2=trans1;

     PA = new PosAxis();

     PA.values[0] = trans2.position.x;
     PA.values[1] = trans2.position.y;  
     PA.values[2] = trans2.position.z;

      switch(directionAxis){

           case Axis.X:
             PA.pointer = 0;
           break;

           case Axis.Y:
              PA.pointer = 1;
           break;

           case Axis.Z:
             PA.pointer = 2;
           break;

        }
  }  


  void Update(){

      PA.values[PA.pointer] = PA.values[PA.pointer] + Time.deltaTime*speed;

      Vector3 pos = new Vector3(PA.values[0],PA.values[1],PA.values[2]);

      trans1.position = pos;
  }    

}

 
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist



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

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

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