/// <summary> /// Ensures player is above terrain /// </summary> public virtual void Unstuck(bool toSurface = true) { #if UNITY_EDITOR if (env.constructorMode) { return; } #endif if (env.CheckCollision(env.cameraMain.transform.position) || env.CheckCollision(transform.position)) { // try to move to last good position if (m_LastNonCollidingCharacterPos.y < float.MaxValue && !env.CheckCollision(m_LastNonCollidingCharacterPos)) { MoveTo(m_LastNonCollidingCharacterPos); return; } // try up or surface float minAltitude = Mathf.FloorToInt(transform.position.y) + 1.1f; if (toSurface) { minAltitude = Mathf.Max(env.GetTerrainHeight(transform.position), minAltitude); } Vector3 pos = new Vector3(transform.position.x, minAltitude + GetCharacterHeight() * 0.5f, transform.position.z); MoveTo(pos); } }
void LateUpdate() { if (!env.initialized) { return; } // Check if position has changed since previous Vector3 position = transform.position; int x, y, z; FastMath.FloorToInt(position.x, position.y, position.z, out x, out y, out z); if (lastX != x || lastY != y || lastZ != z) { requireUpdateLighting = true; lastPosition = position; lastX = x; lastY = y; lastZ = z; if (forceUnstuck) { Vector3 pos = transform.position; pos.y += 0.1f; if (env.CheckCollision(pos)) { float deltaY = FastMath.FloorToInt(pos.y) + 1f - pos.y; pos.y += deltaY + 0.01f; transform.position = pos; lastX--; } } CheckNearChunks(position); } if (requireUpdateLighting) { requireUpdateLighting = false; UpdateLightingNow(); } }
void LateUpdate() { if (!env.initialized) { return; } // Check if position has changed since previous Vector3 position = transform.position; int x = FastMath.FloorToInt(position.x); int y = FastMath.FloorToInt(position.y); int z = FastMath.FloorToInt(position.z); if (lastX == x && lastY == y && lastZ == z) { return; } lastPosition = position; lastX = x; lastY = y; lastZ = z; UpdateLighting(); if (forceUnstuck) { Vector3 pos = transform.position; pos.y += 0.1f; if (env.CheckCollision(pos)) { float deltaY = FastMath.FloorToInt(pos.y) + 1f - pos.y; pos.y += deltaY + 0.01f; transform.position = pos; lastX--; } } CheckNearChunks(position); }