Класс Player:
Синтаксис:
Используется csharp
[HideInInspector] private Transform transform1;
public Transform Transform
{
get
{
Debug.Log("[Player] Transform Asked. IsNull: " + (transform1 == null));
return transform1;
}
set
{
Debug.Log("[Player] Transform Changed! IsNull: " + (value == null));
transform1 = value;
}
}
protected override void Awake()
{
base.Awake();
Transform = transform;
Debug.Log("[Player] Awake");
}
public Transform Transform
{
get
{
Debug.Log("[Player] Transform Asked. IsNull: " + (transform1 == null));
return transform1;
}
set
{
Debug.Log("[Player] Transform Changed! IsNull: " + (value == null));
transform1 = value;
}
}
protected override void Awake()
{
base.Awake();
Transform = transform;
Debug.Log("[Player] Awake");
}
Класс PlayerController:
Синтаксис:
Используется csharp
private Transform _transform;
public Transform Transform {
get
{
Debug.Log("[PlayerController] Transform Asked. IsNull: " + (_transform == null));
return _transform;
}
set
{
Debug.Log("[PlayerController] Transform Changed! IsNull: " + (value == null));
_transform = value;
}
}
Player player;
private void Start()
{
Debug.Log("[PlayerController] Start");
player = GetComponent<Player>();
Debug.Log("[PlayerController] Player Is Null: " + (player == null));
Transform = player.Transform;
}
private void GamepadLook(Vector2 value)
{
sbyte signX = (sbyte)Mathf.Sign(value.x);
if (value.x != 0)
{
if (IsFacingRight && value.x < 0) { Flip(); IsFacingRight = false; }
if (!IsFacingRight && value.x > 0) { Flip(); IsFacingRight = true; }
}
}
void Flip()
{
Debug.Log("[PlayerController] 2Transform Is null: " + (Transform == null));
if (Transform == null)
{
Transform = Player.Instance.Transform;
}
Transform.Rotate(0f, 180f, 0f);
}
public Transform Transform {
get
{
Debug.Log("[PlayerController] Transform Asked. IsNull: " + (_transform == null));
return _transform;
}
set
{
Debug.Log("[PlayerController] Transform Changed! IsNull: " + (value == null));
_transform = value;
}
}
Player player;
private void Start()
{
Debug.Log("[PlayerController] Start");
player = GetComponent<Player>();
Debug.Log("[PlayerController] Player Is Null: " + (player == null));
Transform = player.Transform;
}
private void GamepadLook(Vector2 value)
{
sbyte signX = (sbyte)Mathf.Sign(value.x);
if (value.x != 0)
{
if (IsFacingRight && value.x < 0) { Flip(); IsFacingRight = false; }
if (!IsFacingRight && value.x > 0) { Flip(); IsFacingRight = true; }
}
}
void Flip()
{
Debug.Log("[PlayerController] 2Transform Is null: " + (Transform == null));
if (Transform == null)
{
Transform = Player.Instance.Transform;
}
Transform.Rotate(0f, 180f, 0f);
}
Теперь к проблеме. При первом запуске игры загружается меню. При нажатии любой клавиши загружается игровая сцена с игроком, на котором эти скрипты весят. Игрок нормально передвигается, все работает корректно. Далее после возврата обратно в меню сцена с игроком выгружается. При повторном входе в игру сцена снова загружается, но на второй раз персонаж уже не ходит и (до добавления проверок на null) юнька выдавала исключение MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it. При этом игрок на сцене просто сразу есть. Не исчезает, не телепортируется, не умирает, не создается из префаба. После того, как в методе Flip переприсваивается значение далее ссылка всегда указывает куда нужно.
При загрузке игровой сцены сообщения выходят в следующем порядке:
[Player] Transform Changed! IsNull: False
[Player] Awake
[PlayerController] Start
[PlayerController] Player Is Null: False
[Player] Transform Asked. IsNull: False
[PlayerController] Transform Changed! IsNull: False
И при попытке подвигать стик:
[PlayerController] Transform Asked. IsNull: True
[PlayerController] 2Transform Is null: True
[PlayerController] Transform Asked. IsNull: True
[Player] Transform Asked. IsNull: False
[PlayerController] Transform Changed! IsNull: False
[PlayerController] Transform Asked. IsNull: False
И после этого уже при движении стика постоянно
[PlayerController] 2Transform Is null: False
[PlayerController] Transform Asked. IsNull: False
У меня закрадывается подозрение, что это сборщик мусора чистит ссылочки, но кто знает, может я чего-то очевидного не вижу.
P.S. Я понимаю, что можно не заморачиваться, а просто взять в Старте ссылки на компонент с помощью еще одного GetComponent, но все же хотелось бы узнать в чем причина такого поведения.