【问题标题】:Unity3D: Camera is unable to move with firstperson scriptUnity3D:相机无法使用第一人称脚本移动
【发布时间】:2019-04-09 04:44:45
【问题描述】:

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

问题是用户无法在第一人称模式下通过轴“鼠标 X”和“鼠标 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);
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

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

    编辑:

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

    【讨论】:

    • 是的,但我仍然需要前面的物体用相机直接瞄准
    • 您的意思是您有卫星的 3d 模型吗?在这种情况下,您将创建一个名为 SatteliteWrapper 或类似名称的空父对象,并将 Orbit 脚本附加到该对象。然后你可以让相机成为SatteliteWrapper 的孩子,并使3d 模型成为相机的孩子。这是否描述了你的情况?如果是这样,我会更新我的答案。
    • 我已经编辑了我的原始答案以包含之前的评论。如果现在一切正常,请考虑将我的答案标记为已接受。
    • 当我将卫星对象设为相机的子对象时,它会变得不可见?
    • 是否有可能不是隐形而是移动到其他地方?我会在 Inspector 中检查卫星的坐标,并确保位置保持为零。也不应该有任何脚本附加到卫星本身,只附加到包装器和相机上。还要仔细检查卫星在哪一层。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多