0

После компиляции тестового проекта выдает в логе "object reference not set to an instance of an object", хотя в редакторе все работает + через дебаг проверял, есть ли ссылки на объект(в моем случае океан). В программировании начинающий, прошу сильно не бить :)

Текст ошибки из лога:

  at OceanManager.WaterHeightAtPositions (UnityEngine.Vector3 position) [0x00001] in C:\Users\KIRIN\Ships\Assets\Scripts\OceanManager.cs:41 
  at Floater.FixedUpdate () [0x00010] in C:\Users\KIRIN\Ships\Assets\Scripts\Floater.cs:31 
(Filename: C:/Users/KIRIN/Ships/Assets/Scripts/Floater.cs Line: 31)

в этой строке

float difference = floatersPoints[i].transform.position.y - OceanManager.instance.WaterHeightAtPositions(floatersPoints[i].position);

Сами скрипты:

OceanManager

    public float waveHeight = 7f, waveFrenquency = 1f, waveSpeed = 1f;
public Transform ocean;

public static OceanManager instance;


Material oceanMat;
Texture2D displacementWater;

private void Awake()
{
    if (instance == null)
    {
        instance = this;
    }
    else if (instance != this)
    {
        Debug.Log("Instance alredy exists");
        Destroy(this);
    }

}
void SetVariables()
{
    oceanMat = ocean.GetComponent<Renderer>().sharedMaterial;
    displacementWater = (Texture2D)oceanMat.GetTexture("_WaveDisplacement");
}

public float WaterHeightAtPositions( Vector3 position)
{
    return ocean.position.y + displacementWater.GetPixelBilinear(position.x * waveFrenquency / 100, position.z * waveFrenquency / 100 + Time.time * waveSpeed / 100).g * waveHeight / 10 * ocean.localScale.x;
}
private void OnValidate()
{
    if (!oceanMat)
    {
        SetVariables();
    }
    UpdateMaterial();
}

private void UpdateMaterial()
{
    oceanMat.SetFloat("_WavesSpeed", waveSpeed / 100);
    oceanMat.SetFloat("_WavesFrenquency", waveFrenquency / 100);
    oceanMat.SetFloat("_WavesHeights", waveHeight / 10);
}

}

Floater


    public float underWaterDrag = 1f, underWaterAngularDrag = 1f;
    public float airDrag = 0f, airAngularDrag = 0.05f;
    public float floatingPower = 15f;
OceanManager oceanManager;
Rigidbody _rigidbody;

int floatersUnderwater;

bool underwater;


void Start()
{
    _rigidbody = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    floatersUnderwater = 0;
    for (int i = 0; i < floatersPoints.Length; i++)
    {
        float difference = floatersPoints[i].transform.position.y - OceanManager.instance.WaterHeightAtPositions(floatersPoints[i].position);

        if (difference < 0)
        {
            _rigidbody.AddForceAtPosition(Vector3.up * floatingPower * Mathf.Abs(difference), floatersPoints[i].transform.position, ForceMode.Force);
            floatersUnderwater += 1;
            if (!underwater)
            {
                underwater = true;
                SwitchStateBody(true);
            }
        }
        if (underwater && floatersUnderwater == 0)
        {
            underwater = false;
            SwitchStateBody(false);

        }
    }
}

void SwitchStateBody(bool isUnderwater)
{
    if (isUnderwater)
    {
        _rigidbody.drag = underWaterDrag;
        _rigidbody.angularDrag = underWaterAngularDrag;
    }
    else
    {
        _rigidbody.drag = airDrag;
        _rigidbody.angularDrag = airAngularDrag;
    }
}

В редакторе объекты плавают путем указаний GameObject'ов

При запуске скомпилированой игры корабли проваливаются и выводится тонна ошибок из лога, которую описал в самом начале

Буду очень признателен за помощь

aepot
  • 49,560
  • Обрезая заголовки классов вы затрудняете чтение кода. В какой строке ошибка? – aepot Dec 17 '21 at 15:15
  • Извиняюсью ругается в скрипте OceanManager, метод - public float WaterHeightAtPositions( Vector3 position). При его вызове, ошибку выдает на то, что в экземпляре нету ссылки на объект в скрипте Floater, в этой строке - float difference = floatersPoints[i].transform.position.y - OceanManager.instance.WaterHeightAtPositions(floatersPoints[i].position);

    Если убрать то, что идет после минуса, то все будет работать коректно. Ругается на океан, возможно из-за того что высота вершин регулируется шейдером

    – Dmitrij Leukhin Dec 17 '21 at 16:01
  • Насколько я понял, у вас есть функция SetVariables() в которой вы инциализируете displacement Water, если вы её нигде не вызываете, то ваш displacementWater = null – nanamar Dec 17 '21 at 16:05
  • void SetVariables() быть может void Start() надо?\ – aepot Dec 17 '21 at 16:13
  • В шейдере displacementWater это текстура, которая уже применена. Поле displacementWater дополнительно закинул в Awake и продебажил в двух местах вызова, и это поле не есть null – Dmitrij Leukhin Dec 17 '21 at 16:15
  • 1
    @aepot изменил код, засунув его в Авейк и Старт — и оно заработало! Сейчас буду разбиратся детальней, благодарю за наводку) Оффтоп - как отблагодарить сдесь? – Dmitrij Leukhin Dec 17 '21 at 16:23
  • Оффтоп - никак) – aepot Dec 17 '21 at 17:51
  • Значит что-то не присвоено но используется (просто проверь возможные варианты) – Lesh Dec 20 '21 at 12:36

0 Answers0