コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
        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);
        }