【问题标题】:Stop camera from moving through objects阻止相机穿过物体
【发布时间】:2018-05-07 02:32:59
【问题描述】:

关于这个主题有很多问题,但我找不到适合我的问题。

我的相机移动脚本如下所示:

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

[AddComponentMenu("Camera-Control/Smooth Mouse Look")]
public class SmoothMouseLook : NetworkBehaviour
{
    [Header("Character camera.")]
    private Camera myCamera;
    [Header("Location where camera will always be looking at.")]
    public Transform characterHead;

    [Header("How fast will camera zoom work")]
    public float cameraScrollSensitivity = 2f;

    [Header("Default position of camera")]
    public Vector3 cameraPos = new Vector3(0, 2, 0);

    public Vector3 minPos = new Vector3(-4, -4, -5);
    public Vector3 maxPos = new Vector3(4, 4, -1);

    [Header("How fast will camera move on Y axis")]
    public float cameraSensitivityY = 0.8f;
    [Header("How fast will camera move on X axis")]
    public float cameraSensitivityX = 0.8f;

    public enum InvertX { False = 0, True = 1 }
    public enum InvertY { False = 0, True = 1 }

    public InvertX invertX = InvertX.False;
    public InvertY invertY = InvertY.False;

    void Start()
    {
        if (!isLocalPlayer)
            return;

        Camera.main.gameObject.transform.parent = this.transform;
        Camera.main.gameObject.transform.localPosition = cameraPos;
        myCamera = Camera.main;

        myCamera.transform.LookAt(characterHead);

    }
    void Update()
    {
        if (!isLocalPlayer)
            return;

        Vector3 currPos = myCamera.transform.localPosition;

        currPos.z += Input.GetAxis("Mouse ScrollWheel") * cameraScrollSensitivity;
        if (currPos.z > maxPos.z)
            currPos.z = maxPos.z;
        if (currPos.z < minPos.z)
            currPos.z = minPos.z;

        if (Input.GetMouseButton(2))
        {

            if(invertY == 0)
                currPos.y -= Input.GetAxis("Mouse Y") * cameraSensitivityY / 10;
            else
                currPos.y += Input.GetAxis("Mouse Y") * cameraSensitivityY / 10;


            if (invertX == 0)
                currPos.x += Input.GetAxis("Mouse X") * cameraSensitivityX / 10;
            else
                currPos.x -= Input.GetAxis("Mouse X") * cameraSensitivityX / 10;


            if (currPos.y > maxPos.y)
                currPos.y = maxPos.y;
            if (currPos.y < minPos.y)
                currPos.y = minPos.y;
            if (currPos.x > maxPos.x)
                currPos.x = maxPos.x;
            if (currPos.x < minPos.x)
                currPos.x = minPos.x;
        }

        myCamera.transform.localPosition = currPos;

        myCamera.transform.LookAt(characterHead);
    }
}

这个脚本附加到角色和相机是它的孩子。

正如标题所说,问题是相机可以穿过网格(物体和地形)。

我尝试将 Culling mask 设置为 0.01 和 1(默认为 0.3),但没有任何反应。

我尝试添加对撞机,但当我将相机推到地面时它会发生碰撞,不会让相机失望但它会抬起角色:/

我唯一的想法是使用 raycast 对其进行编码,但由于我对这一切都不熟悉,所以我想检查是否有其他方法可以做到这一点(例如使用对撞机但不提升角色),因为这需要很多我花时间用 raycast 解决这个问题。

【问题讨论】:

    标签: c# unity3d camera


    【解决方案1】:

    你能试试做这件事吗?如果您的意思是不通过虚幻引擎中的相机之类的网格,您可以这样做

    1. 选择相机,进入检查器,将近剪裁平面设置为 0.1
    2. 创建一个空的游戏对象。给空的盒子碰撞器,并将其设置为相机的确切位置。最后将空对象设置为相机的父对象。现在,当您移动 Empty 时,它会移动相机,并且不会穿过墙壁。

    希望对你有帮助

    【讨论】:

    • I tried adding collider which works BUT when i push camera to the ground it collides, doesn't let camera down but it lift character up :/ 是我写的,所以它不起作用:/
    • 你可以写一个条件语句,类似于if(cameraposition &lt; neartheground){//you could lift it up just a little bit}
    • 当它到达任何网格(左上右下)时,它开始推动
    • 推网?您可以尝试将质量添加到网格中
    • 那么我的角色物理与应有的不同。不管怎样,谢谢你看这个,我已经开始用 raycast 做,我已经完成了一半(工作很好,但我想让它顺利)所以我会想办法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多