Unity3D:相机无法使用第一人称脚本移动

时间:2019-04-07 21:21:10

标签: c# unity3d

该对象是卫星类型的,所以我有一个脚本可以使用其位置在轨道上移动该对象。而且我还有一个脚本可以在第一人称模式下移动卫星对象。

问题是在第一人称模式下,用户无法通过“ Mouse X”和“ Mouse Y”轴移动相机。发生问题是因为轨道脚本和第一人称脚本都在控制摄像机,因此无法移动。在游戏中,当您移动鼠标时,您会看到相机晃动,而当我禁用轨道脚本时,第一人称将起作用。

如何解决此问题?

解决方案可以是只将位置用于轨道,将旋转用于第一人称控制?第一人称模式将不会控制对象位置的旋转。轨道将不会控制对象仅旋转的位置。

谢谢!

轨道脚本

private void FixedUpdate()
{
    transform.RotateAround(centerOfOrbit.position, orbitAxis, orbitSpeed * Time.deltaTime);
    desiredOrbitPosition = (transform.position - centerOfOrbit.position).normalized * orbitRadius + centerOfOrbit.position;
    transform.position = Vector3.MoveTowards(transform.position, desiredOrbitPosition, Time.deltaTime * orbitAdjustSpeed);
}

“第一人称”模式控件(不适用于Orbit)

private void Update()
{
    if(allowFirstPerson)
    {
        x+= Input.GetAxis ("Mouse X") * turnSpeed;
        if (allowTiltingForward)
        {
            y -= Input.GetAxis("Mouse Y") * turnSpeed;
        }

        y = ClampAngle(y, minVerticalAngle, maxVerticalAngle);
        if (minHorizontalAngle != 0 || maxHorizontalAngle != 0)
        {
            x = ClampAngle(x, minHorizontalAngle, maxHorizontalAngle);
        }
        Quaternion rotation = Quaternion.Euler(y, x, 0);
        Vector3 direction = (rotation * Vector3.forward * 100);
        aimPoint = new Vector3(direction.x + aimError, direction.y + aimError, direction.z + aimError);
        aimDir = (aimPoint - playerCamera.transform.position).normalized;
    }
}

此“顶视图”模式控件可与Orbit脚本一起使用,但顶视图使用的控件与第一人称视角不同,但我似乎无法弄清为什么一个可以起作用而另一个不起作用。

顶视图模式控件(与Orbit配合使用)

private void Update()
{
    if(allowTopView)
    {
        Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        topDownAimPoint = new Vector3(0,0,0);
        if(Physics.Raycast(ray, out hit))
        {
           topDownAimPoint = hit.point;
        }
        aimPoint = new Vector3(topDownAimPoint.x + aimError, topDownAimPoint.y + aimError, topDownAimPoint.z + aimError);
    }
}

1 个答案:

答案 0 :(得分:0)

我的理解是,您的问题是由两个试图为同一对象设置旋转的脚本引起的:摄像机。在这种情况下,您可以创建一个空的Satellite对象,并使摄像机成为层次结构中该对象的子对象。将“轨道脚本”附加到Satellite对象,并将“第一人称”脚本附加到摄像机,将允许摄像机在卫星的轨道中移动,但仍具有自己的独立旋转。

编辑:

要在这种情况下容纳3d模型,请创建一个名为SatteliteWrapper(或类似名称)的空父对象,并将Orbit脚本附加到该对象。然后将相机设为SatteliteWrapper的子代,并将3d模型设为相机的子代。这样可以使模型随相机旋转。