首页 文章

Unity相机的起始位置

提问于
浏览
2

你好,所以我为我正在制作的RTS游戏创建了一个摄像头,但是一开始摄像头位于minHight位置,我无法弄清楚如何改变它希望有人帮助代码有点混乱它只是为了测试这里是我希望它从给出的maxHight位置开始而不是在minHight上的代码 .

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RtsCamera : MonoBehaviour {


    public float zoomSensitivy = 15;
    private Transform m_Transform;
    public float screenEdgeBorder = 25f;
    public bool useScreenEdgeInput = true;
    public float screenEdgeMovementSpeed = 3f;

    // zoom stuff
    public float heightDampening = 5f;
    public float scrollWheelZoomingSensitivity = 25f;
    public float maxHeight = 10f; //maximal height
    public float minHeight = 15f; //minimnal height
    public LayerMask groundMask = -1;
    public bool autoHeight = true;
    public bool limitMap = true;
    public float limitX = 50f; //x limit of map
    public float limitZ = 50f; //z limit of map
    private float zoomPos = 0; //value in range (0, 1) used as t in Matf.Lerp
    public bool useScrollwheelZooming = true;

    Vector3 tempPos;


    public string zoomingAxis = "Mouse ScrollWheel";

    private float ScrollWheel
    {
        get { return Input.GetAxis(zoomingAxis); }
    }

    private Vector2 MouseAxis
    {
        get { return new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); }
    }
    private Vector2 MouseInput
    {
        get { return Input.mousePosition; }
    }


    private void Start()
    {

        m_Transform = transform;

    }
    // Update is called once per frame
    void Update () {
        Move();
        LimitPosition();
        HeightCalculation();







    }
    private void Move()
    {


        if (useScreenEdgeInput)
        {
            Vector3 desiredMove = new Vector3();

            Rect leftRect = new Rect(0, 0, screenEdgeBorder, Screen.height);
            Rect rightRect = new Rect(Screen.width - screenEdgeBorder, 0, screenEdgeBorder, Screen.height);
            Rect upRect = new Rect(0, Screen.height - screenEdgeBorder, Screen.width, screenEdgeBorder);
            Rect downRect = new Rect(0, 0, Screen.width, screenEdgeBorder);

            desiredMove.x = leftRect.Contains(MouseInput) ? -1 : rightRect.Contains(MouseInput) ? 1 : 0;
            desiredMove.z = upRect.Contains(MouseInput) ? 1 : downRect.Contains(MouseInput) ? -1 : 0;

            desiredMove *= screenEdgeMovementSpeed;
            desiredMove *= Time.deltaTime;
            desiredMove = Quaternion.Euler(new Vector3(0f, transform.eulerAngles.y, 0f)) * desiredMove;
            desiredMove = m_Transform.InverseTransformDirection(desiredMove);

            m_Transform.Translate(desiredMove, Space.Self);
        }

    }
    private void LimitPosition()
    {
        if (!limitMap)
            return;

        m_Transform.position = new Vector3(Mathf.Clamp(m_Transform.position.x, -limitX, limitX),
            m_Transform.position.y,
            Mathf.Clamp(m_Transform.position.z, -limitZ, limitZ));
    }

    private void HeightCalculation()
    {
        float distanceToGround = DistanceToGround();
        if (useScrollwheelZooming)
            zoomPos += ScrollWheel * Time.deltaTime * scrollWheelZoomingSensitivity;


        zoomPos = Mathf.Clamp01(zoomPos);

        float targetHeight = Mathf.Lerp(minHeight, maxHeight, zoomPos);
        float difference = 0;

        if (distanceToGround != targetHeight)
            difference = targetHeight - distanceToGround;

       m_Transform.position = Vector3.Lerp(m_Transform.position,
            new Vector3(m_Transform.position.x, targetHeight + difference, m_Transform.position.z), Time.deltaTime * heightDampening);
    }
    private float DistanceToGround()
    {
        Ray ray = new Ray(m_Transform.position, Vector3.down);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, groundMask.value))
            return (hit.point - m_Transform.position).magnitude;

        return 0f;
    }



}

1 回答

  • 1

    将第25行的变量 zoomPos 的值设置为1或0,具体取决于您是希望它在最小高度还是最大高度,您可以在 Start() 中或仅在变量声明处执行此操作 .

    这是因为在 HeightCalculation 函数中,它根据 zoomPos 的值将高度设置在最小值和最大值之间,当您使用滚轮时,此值会发生变化,缩放也会变化 . 在运行游戏之前更改 zoomPos 允许您有效地设置默认的起始高度 .

相关问题