Почему Vector3 должен быть публичным или сериализованным, чтобы установить его значение из другого скрипта - PullRequest
0 голосов
/ 12 июня 2018

Любой желающий может объяснить, почему direction = bulletDirection; работает только тогда, когда direction общедоступен или [SerializeField] private?

У меня есть Shot() на другом скрипте, и я использую его для установки direction.

private void Shot(){

    GameObject bullet = bulletPrefab;

    // Set Facing Side and Instantiate the Bullet
    if (activePlayerController.facingSide == PlayerController.FacingSide.Right) {
        bullet.GetComponent<BulletController> ().SetDirection (Vector3.right);
    } else if (activePlayerController.facingSide == PlayerController.FacingSide.Left) {
        bullet.GetComponent<BulletController> ().SetDirection (Vector3.left);
    }
    Instantiate (bullet, activePlayer.transform.position, Quaternion.identity, bulletsParent.transform);
}

Но direction устанавливается на bulletDirection только тогда, когда он открыт или [SerializeField] private.Когда личное, это всегда Vector3.zero.

[SerializeField] private Vector3 direction;

void FixedUpdate () {
    transform.Translate (direction * speed * Time.deltaTime);
}

public void SetDirection(Vector3 bulletDirection) {
    direction = bulletDirection;
}

1 Ответ

0 голосов
/ 12 июня 2018

Я бы спросил в комментариях, но у меня пока нет представителя.Итак, я бы посоветовал взглянуть на все времена, когда «направление» обновляется.

Во-первых, когда вы создаете новый элемент, вызывается метод Awake (), хотя Start ()только до следующего обновления кадра.Таким образом, в промежутке между этими периодами любой код, который запускается в Awake () и Start (), может потенциально повлиять на ваш процесс инициализации.

Один из способов определения точных значений и точек в вашем коде, которые обновляютЗначение «direction» - вместо этого изменить направление к свойству и проверять трассировку стека при каждой модификации.Вы сделаете это с помощью следующего кода:

#if UNITY_EDITOR
using System.Diagnostics;
using System.Text;
#endif

public class BulletController : MonoBehaviour
{
    private Vector3 _direction = Vector3.None;
    public Vector3 direction
    {
        get
        {
            return _direction;
        }
        set
        {
            _direction = value;
#if UNITY_EDITOR
            StringBuilder sb = new StringBuilder ( "direction updated.\n" );
            StackTrace trace = new StackTrace ( true );
            for ( int i = 0; i < trace.FrameCount; i++ ) // You could use "for ( int i = 1; ... ", after you get the hang of it.
            {
                StackFrame sf = trace.GetFrame ( i );
                sb.AppendLine ( $"[{value}] {sf.GetMethod ( )} : {sf.GetFileName ( )} ({sf.GetFileLineNumber ( )})" );
            }
            UnityEngine.Debug.Log ( sb.ToString ( ) );
#endif
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...