Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 相机旋转后的滚动_C#_Unity3d_Camera_Rotation - Fatal编程技术网

C# 相机旋转后的滚动

C# 相机旋转后的滚动,c#,unity3d,camera,rotation,C#,Unity3d,Camera,Rotation,我正在用C#在Unity中编写一种RTS CameraController。我已经设法实现了基本功能,但现在我面临一个棘手的问题。我设法旋转了我的相机,然后移动到正确的方向,但旋转后我的滚动边界不再工作(当然,因为我只是在水平滚动中检查x,但旋转后我需要检查y)。对于边界,我的意思是限制只滚动到某个位置(x0) &&transform.position.xScreen.height-vertDist | | Input.GetAxis(“垂直”)>0) &&变换.position.z0)){ /

我正在用C#在Unity中编写一种RTS CameraController。我已经设法实现了基本功能,但现在我面临一个棘手的问题。我设法旋转了我的相机,然后移动到正确的方向,但旋转后我的滚动边界不再工作(当然,因为我只是在水平滚动中检查x,但旋转后我需要检查y)。对于边界,我的意思是限制只滚动到某个位置(x<0)

我有点纠结于如何轻松地解决我的问题。一种方法似乎是使用条件并在检查边界之前检查旋转,但这对我来说似乎不是一个好方法,只是解决了问题,但没有真正考虑原因。现在我的问题是:有没有更简单或更好的方法来实现我正在做的事情?我完全错过了什么吗

这就是我希望相机在所有4个旋转中移动的方式。矩形是我的世界,箭头定义了我的界限。摄像机应始终在向后方向超调,并在向前方向的边界之前停止:

这是我的更新方法(垂直距离和水平距离只是定义鼠标滚动的开始时间):

void LateUpdate(){
//左
if((Input.mousePosition.x0)
transform.Translate(-speed,0,0);
//对
if((Input.mousePosition.x>Screen.width-horDist | | Input.GetAxis(“水平”)>0)
&&transform.position.xScreen.height-vertDist | | Input.GetAxis(“垂直”)>0)
&&变换.position.z-10){
Vector3温度=transform.eulerAngles;
transform.eulerAngles=新矢量3(0,transform.eulerAngles.y,transform.eulerAngles.z);
transform.Translate(0,0,-速度);
transform.eulerAngles=温度;
}
//变焦
//camera.fieldOfView-=Input.GetAxis(“鼠标滚轮”);
//轮换
if(Input.GetButtonDown(“旋转”)){
Vector3 targetPosition=transform.position;
targetPosition+=transform.forward*27;
//transform.Rotate(新矢量3(0,数学符号(Input.GetAxis(“Rotate”))*90,0),Space.World);
transform.RotateAround(targetPosition,Vector3.up,数学符号(Input.GetAxis(“Rotate”))*90);
}
}
使用

它只会根据它的本地位置而不是世界位置移动。但你会得到你想要的。
希望有帮助。

我终于找到了解决办法!我决定根据当前旋转定义一个矩形,然后检查相机位置是否在矩形内。因此,我不得不把位置弄得一团糟,因为我不知道为什么Rect.Contains()只接受位置的x和y坐标。我的相机只是沿着x轴和z轴移动,所以我在那里做了一个奇怪的坐标交换:

    void LateUpdate() {
    Rect bounds = DefineBounds();
    Vector3 pos = transform.position;

    //LEFT
    if((/*Input.mousePosition.x < horDist ||*/ Input.GetAxis("Horizontal") < 0)) {
        pos += transform.TransformDirection(-speed * Time.deltaTime, 0, 0);
        //reset pos if out of bounds
        if(!bounds.Contains(new Vector2(pos.x, pos.z)))
            pos -= transform.TransformDirection(-speed * Time.deltaTime, 0, 0);
    }
    //RIGHT
    if((/*Input.mousePosition.x > Screen.width - horDist ||*/ Input.GetAxis("Horizontal") > 0)) {
        pos += transform.TransformDirection(speed * Time.deltaTime, 0, 0);
        //reset pos if out of bounds
        if(!bounds.Contains(new Vector2(pos.x, pos.z)))
            pos -= transform.TransformDirection(speed * Time.deltaTime, 0, 0);
    }
    //UP
    if((/*Input.mousePosition.y > Screen.height - vertDist ||*/ Input.GetAxis("Vertical") > 0)) {
        //Set camera x-angle to 0
        Vector3 temp = transform.eulerAngles;
        transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z);

        pos += transform.TransformDirection(0, 0, speed * Time.deltaTime);
        //reset pos if out of bounds
        if(!bounds.Contains(new Vector2(pos.x, pos.z)))
            pos -= transform.TransformDirection(0, 0, speed * Time.deltaTime);

        //Reset camera x-angle
        transform.eulerAngles = temp;
    }
    //DOWN
    if((/*Input.mousePosition.y < vertDist ||*/ Input.GetAxis("Vertical") < 0)) {
        //Set camera x-angle to 0
        Vector3 temp = transform.eulerAngles;
        transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z);

        pos += transform.TransformDirection(0, 0, -speed * Time.deltaTime);
        //reset pos if out of bounds
        if(!bounds.Contains(new Vector2(pos.x, pos.z)))
            pos -= transform.TransformDirection(0, 0, -speed * Time.deltaTime);

        //Reset camera x-angle
        transform.eulerAngles = temp;
    }

    transform.position = pos;

    //ZOOM
    //camera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel");
    transform.position = new Vector3(pos.x, pos.y - Input.GetAxis("Mouse ScrollWheel"), pos.z);

    //ROTATE
    if(Input.GetButtonDown("Rotate")){
        Vector3 targetPosition = transform.position;
        Vector2 posXZ;

        targetPosition += transform.forward * 27;
        transform.RotateAround(targetPosition, Vector3.up, Mathf.Sign(Input.GetAxis("Rotate")) * 90);
        bounds = DefineBounds();

        pos = transform.position;
        posXZ = new Vector2(pos.x, pos.z);

        while(!bounds.Contains(posXZ)) {
            posXZ = Vector2.MoveTowards(posXZ, bounds.center, 1);

            pos.x = posXZ.x;
            pos.z = posXZ.y;
        }
        transform.position = pos;
    }
}
void LateUpdate(){
矩形边界=定义边界();
向量3位置=变换位置;
//左
if((/*Input.mousePosition.xScreen.width-horDist |*/Input.GetAxis(“水平”)>0)){
pos+=变换变换方向(速度*时间增量,0,0);
//如果超出边界,则重置位置
如果(!bounds.Contains(新向量2(位置x,位置z)))
pos-=transform.TransformDirection(速度*时间增量,0,0);
}
//向上
if((/*Input.mousePosition.y>Screen.height-vertDist |*/Input.GetAxis(“垂直”)>0)){
//将摄影机x角度设置为0
Vector3温度=transform.eulerAngles;
transform.eulerAngles=新矢量3(0,transform.eulerAngles.y,transform.eulerAngles.z);
pos+=transform.TransformDirection(0,0,速度*时间增量);
//如果超出边界,则重置位置
如果(!bounds.Contains(新向量2(位置x,位置z)))
pos-=transform.TransformDirection(0,0,速度*时间增量);
//重置相机x角度
transform.eulerAngles=温度;
}
//向下
if((/*Input.mousePosition.ytransform.Translate(0, 0, -speed, Space.Self); // For all the Translate, use Space.Self
    void LateUpdate() {
    Rect bounds = DefineBounds();
    Vector3 pos = transform.position;

    //LEFT
    if((/*Input.mousePosition.x < horDist ||*/ Input.GetAxis("Horizontal") < 0)) {
        pos += transform.TransformDirection(-speed * Time.deltaTime, 0, 0);
        //reset pos if out of bounds
        if(!bounds.Contains(new Vector2(pos.x, pos.z)))
            pos -= transform.TransformDirection(-speed * Time.deltaTime, 0, 0);
    }
    //RIGHT
    if((/*Input.mousePosition.x > Screen.width - horDist ||*/ Input.GetAxis("Horizontal") > 0)) {
        pos += transform.TransformDirection(speed * Time.deltaTime, 0, 0);
        //reset pos if out of bounds
        if(!bounds.Contains(new Vector2(pos.x, pos.z)))
            pos -= transform.TransformDirection(speed * Time.deltaTime, 0, 0);
    }
    //UP
    if((/*Input.mousePosition.y > Screen.height - vertDist ||*/ Input.GetAxis("Vertical") > 0)) {
        //Set camera x-angle to 0
        Vector3 temp = transform.eulerAngles;
        transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z);

        pos += transform.TransformDirection(0, 0, speed * Time.deltaTime);
        //reset pos if out of bounds
        if(!bounds.Contains(new Vector2(pos.x, pos.z)))
            pos -= transform.TransformDirection(0, 0, speed * Time.deltaTime);

        //Reset camera x-angle
        transform.eulerAngles = temp;
    }
    //DOWN
    if((/*Input.mousePosition.y < vertDist ||*/ Input.GetAxis("Vertical") < 0)) {
        //Set camera x-angle to 0
        Vector3 temp = transform.eulerAngles;
        transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z);

        pos += transform.TransformDirection(0, 0, -speed * Time.deltaTime);
        //reset pos if out of bounds
        if(!bounds.Contains(new Vector2(pos.x, pos.z)))
            pos -= transform.TransformDirection(0, 0, -speed * Time.deltaTime);

        //Reset camera x-angle
        transform.eulerAngles = temp;
    }

    transform.position = pos;

    //ZOOM
    //camera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel");
    transform.position = new Vector3(pos.x, pos.y - Input.GetAxis("Mouse ScrollWheel"), pos.z);

    //ROTATE
    if(Input.GetButtonDown("Rotate")){
        Vector3 targetPosition = transform.position;
        Vector2 posXZ;

        targetPosition += transform.forward * 27;
        transform.RotateAround(targetPosition, Vector3.up, Mathf.Sign(Input.GetAxis("Rotate")) * 90);
        bounds = DefineBounds();

        pos = transform.position;
        posXZ = new Vector2(pos.x, pos.z);

        while(!bounds.Contains(posXZ)) {
            posXZ = Vector2.MoveTowards(posXZ, bounds.center, 1);

            pos.x = posXZ.x;
            pos.z = posXZ.y;
        }
        transform.position = pos;
    }
}