После компиляции тестового проекта выдает в логе "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;
}
}
Буду очень признателен за помощь


Если убрать то, что идет после минуса, то все будет работать коректно. Ругается на океан, возможно из-за того что высота вершин регулируется шейдером
– Dmitrij Leukhin Dec 17 '21 at 16:01void SetVariables()быть можетvoid Start()надо?\ – aepot Dec 17 '21 at 16:13