示例#1
0
    void LateUpdate()
    {
        Vector3 previousPos = transform.position;

        if (Input.GetKey(KeyCode.KeypadPlus))
        {
            Scaler.Scale += 0.1f;
        }

        if (Input.GetKey(KeyCode.KeypadMinus))
        {
            Scaler.Scale -= 0.1f;
        }

        if (CurrentCameraMode == CameraMode.Free)
        {
            savedScale = Scaler.Scale;
        }

        if (Input.GetKey(KeyCode.Mouse1))
        {
            float rotationX = Input.GetAxis("Mouse X") * 1f;
            transform.Rotate(0, rotationX, 0);

            float rotationY = Input.GetAxis("Mouse Y") * 1f;
            transform.Rotate(-rotationY, 0, 0);

            if (Input.GetKey(KeyCode.LeftControl))
            {
                float rotationZ = Input.GetAxis("Mouse X") * 1f;
                transform.Rotate(0, 0, rotationZ);
            }

            float speed = translationSpeed * Scaler.Scale;
            if (Input.GetKey(KeyCode.LeftShift))
            {
                speed = translationSpeed * Scaler.Scale * 10;
            }

            if (Input.GetKey(KeyCode.A))
            {
                transform.Translate(-speed, 0, 0);
            }
            if (Input.GetKey(KeyCode.D))
            {
                transform.Translate(speed, 0, 0);
            }

            if (Input.GetKey(KeyCode.S))
            {
                transform.Translate(0, 0, -speed);
            }
            if (Input.GetKey(KeyCode.W))
            {
                transform.Translate(0, 0, speed);
            }

            if (Input.GetKey(KeyCode.Q))
            {
                transform.Translate(0, -speed, 0);
            }
            if (Input.GetKey(KeyCode.E))
            {
                transform.Translate(0, speed, 0);
            }

            targetPosition   = transform.position + transform.forward * currentZoom;
            targetRotation.x = transform.eulerAngles.y;
            targetRotation.y = transform.eulerAngles.x;
            targetRotation.z = transform.eulerAngles.z;
        }
        else if (orbitActive)
        {
            float xDelta = Input.GetAxis("Mouse X") * xSpeed * 0.01f;
            float yDelta = Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
            if (xDelta != 0 || yDelta != 0)
            {
                //rotationCooldown = 0.5f;
                if (Input.GetKey(KeyCode.Space) ||
                    Input.GetKey(KeyCode.Mouse2))
                {
                    targetRotation.x += xDelta;
                    targetRotation.y -= yDelta;
                }
            }

            if (rotationCooldown > 0)
            {
                rotationCooldown -= Time.deltaTime;
            }
            else
            {
                smoothStartOrbitTime += Time.deltaTime;
                smoothStartOrbitTime  = Mathf.Clamp01(smoothStartOrbitTime);

                targetRotation.x += 0.02f * smoothStartOrbitTime;
                targetRotation.y += 0.02f * smoothStartOrbitTime;
            }

            Quaternion rotation;

            //Debug.Log("currentTravelTime: " + currentTravelTime + ", targetTravelTime: " + targetTravelTime);
            if (currentTravelTime < targetTravelTime)
            {
                Vector3 direction = targetPosition * Scaler.Scale - Camera.mainCamera.transform.position;
                direction.Normalize();

                rotation         = Quaternion.LookRotation(direction);
                targetRotation.x = rotation.eulerAngles.y;
                targetRotation.y = rotation.eulerAngles.x;
                targetRotation.z = rotation.eulerAngles.z;
            }
            else
            {
                rotation      = Quaternion.Euler(targetRotation.y, targetRotation.x, targetRotation.z);
                startPosition = transform.position;
                startRotation = transform.rotation;
            }

            currentZoom = Mathf.Clamp(currentZoom - Input.GetAxis("Mouse ScrollWheel") * zoomSpeed, zoomDistanceMin, zoomDistanceMax);

            Vector3 negDistance = new Vector3(0.0f, 0.0f, -currentZoom);
            Vector3 position    = rotation * negDistance + targetPosition * Scaler.Scale;

            bool wasTraveling = currentTravelTime < targetTravelTime;
            currentTravelTime += Time.deltaTime;
            bool isTraveling = currentTravelTime < targetTravelTime;

            if (wasTraveling && isTraveling == false)
            {
                if (_ActiveStar != null)
                {
                    Sun.CreateSolarSystem(_ActiveStar);
                }
            }

            float percent = 1;

            if (targetTravelTime > 0)
            {
                percent = currentTravelTime / targetTravelTime;
            }
            if (percent > 1)
            {
                percent = 1;
            }

            transform.position = Vector3.Slerp(startPosition, position, Mathf.SmoothStep(0, 1, percent));

            if (isTraveling)
            {
                Scaler.Scale = Mathf.SmoothStep(startScale, targetScale, percent);
            }

            if (targetTravelTime > 0)
            {
                percent = currentTravelTime / (targetTravelTime * 0.5f);
            }
            if (percent > 1)
            {
                percent = 1;
            }
            transform.rotation = Quaternion.Slerp(startRotation, rotation, Mathf.SmoothStep(0, 1, percent));
        }

        GuiManager.Speed = Vector3.Distance(previousPos, transform.position) * (1 / Scaler.Scale);
    }