Передача параметров экземпляру класса Unity 3d C#
Добавлено: 11 фев 2019, 00:20
Добрый вечер. Я новичок. В общем, необходимо создать префаб двери, в который требуется передавать параметры, такие как: смещение оси вращения двери (влево или вправо), угол и скорость вращения двери. Ситуация обстоит следующим образом: 1. Созданы два префаба в папке Resourses: тело двери DoorBody и пустышка DoorController, относительно который будет происходить смещение оси вращения тела двери. 2.Создан пустой объект PrefabController, на который помещен скрипт CreatePrefab, в котором создаются экземпляры класса Door (в нем находятся все необходимые методы, поля и конструктор, через который создаются экземпляры). 3. Через экземпляр класса, благодаря конструктору, подгружаются на сцену два префаба (пустышки и тела двери), затем, через переданный параметр, смещается пустышка на половину ширины двери влево или вправо(метод A()), затем тело двери становится дочерней относительно пустышки (метод S()). Это все прекрасно срабатывает, т.е., путем двух этих методов мы имеем единый префаб со смещенной в нужную нам сторону осью вращения. Далее, в методе Update() есть два метода: Open() и Close(), в которых, собственно, и происходит ошибка: нулевая ссылка на объект, т.е., видимо, параметры, которые мы передаем через экземпляры класса CreatePrefab, благодаря конструктору Door() , передаются не совсем должным образом. Пожалуйста, помогите разобраться.
public class _Door : MonoBehaviour {
private GameObject DoorController;
private GameObject DoorBody;
private float rotation;
private float speed;
private bool left;
public bool isOpen;
public _Door (bool left, float rotation = 120, float speed = 5)
{
this.rotation = rotation;
this.speed = speed;
this.left = left;
this.DoorController = Instantiate(Resources.Load("DoorController", typeof(GameObject))) as GameObject;
this.DoorBody = Instantiate(Resources.Load("DoorBody", typeof(GameObject))) as GameObject;
}
public void A()
{
Movement(); //сдвиг оси вращения
}
public void S()
{
SetParent();
}
public void Update ()
{
if (isOpen)
{
Open();
}
else
{
Close();
}
}
public void Movement()
{
if (left)
{
LeftShift();
}
else
{
RightShift();
}
}
void LeftShift() //сдвиг пустышки влево
{
float width = DoorBody.transform.localScale.z / 2;
DoorController.transform.position = new Vector3(DoorController.transform.position.x, DoorController.transform.position.y, DoorController.transform.position.z - width);
}
void RightShift() //сдвиг пустышки вправо
{
float width = DoorBody.transform.localScale.z / 2;
DoorController.transform.position = new Vector3(DoorController.transform.position.x, DoorController.transform.position.y, DoorController.transform.position.z + width);
}
void Open()
{
DoorController.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(transform.rotation.x, rotation, transform.rotation.z), speed * Time.deltaTime);
}
void Close ()
{
DoorController.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(transform.rotation.x, 0, transform.rotation.z), speed * Time.deltaTime);
}
void SetParent()
{
DoorBody.transform.parent = DoorController.transform;
}
}
public class _CreatePrefab : MonoBehaviour {
void Start ()
{
_Door d = new _Door(true); //экземпляр класса Door
d.A();
d.S();
d.Update(); //ошибка происходит здесь и следующий экземпляр не создаётся
_Door o = new _Door(false);
o.A();
o.S();
o.Update();
}
}
Синтаксис:
Используется csharp
public class _Door : MonoBehaviour {
private GameObject DoorController;
private GameObject DoorBody;
private float rotation;
private float speed;
private bool left;
public bool isOpen;
public _Door (bool left, float rotation = 120, float speed = 5)
{
this.rotation = rotation;
this.speed = speed;
this.left = left;
this.DoorController = Instantiate(Resources.Load("DoorController", typeof(GameObject))) as GameObject;
this.DoorBody = Instantiate(Resources.Load("DoorBody", typeof(GameObject))) as GameObject;
}
public void A()
{
Movement(); //сдвиг оси вращения
}
public void S()
{
SetParent();
}
public void Update ()
{
if (isOpen)
{
Open();
}
else
{
Close();
}
}
public void Movement()
{
if (left)
{
LeftShift();
}
else
{
RightShift();
}
}
void LeftShift() //сдвиг пустышки влево
{
float width = DoorBody.transform.localScale.z / 2;
DoorController.transform.position = new Vector3(DoorController.transform.position.x, DoorController.transform.position.y, DoorController.transform.position.z - width);
}
void RightShift() //сдвиг пустышки вправо
{
float width = DoorBody.transform.localScale.z / 2;
DoorController.transform.position = new Vector3(DoorController.transform.position.x, DoorController.transform.position.y, DoorController.transform.position.z + width);
}
void Open()
{
DoorController.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(transform.rotation.x, rotation, transform.rotation.z), speed * Time.deltaTime);
}
void Close ()
{
DoorController.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(transform.rotation.x, 0, transform.rotation.z), speed * Time.deltaTime);
}
void SetParent()
{
DoorBody.transform.parent = DoorController.transform;
}
}
public class _CreatePrefab : MonoBehaviour {
void Start ()
{
_Door d = new _Door(true); //экземпляр класса Door
d.A();
d.S();
d.Update(); //ошибка происходит здесь и следующий экземпляр не создаётся
_Door o = new _Door(false);
o.A();
o.S();
o.Update();
}
}