c# - 阻止相机穿过物体
问题描述
关于这个主题有很多问题,但我找不到适合我的问题。
我有看起来像这样的相机移动脚本:
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 对其进行编码,但由于我对这一切都不熟悉,所以我想检查是否有任何其他方法可以做到这一点(比如使用对撞机,但不提升角色),因为这将花费我很多时间来计算用光线投射出来。
解决方案
你能不能试着做这件事。如果你的意思是不通过像虚幻引擎中的相机这样的网格,你可以这样做
- 选择相机,进入检查器并将近剪裁平面设置为 0.1
- 创建一个空的游戏对象。给空的盒子碰撞器,并将其设置为相机的确切位置。最后将空对象设置为相机的父对象。现在,当您移动 Empty 时,它会移动相机,并且不会穿过墙壁。
希望这可以帮助
推荐阅读
- c# - 许多相对较大的对象的 C# 垃圾回收
- java - 如何打印 LinkedList 的不同数据?
- selenium - Selenium:JavaScript 警告:return 语句后无法访问代码
- tradingview-api - 在带有底部指示器的主图表上绘制标签
- sql - 如何使用 OFFSET 在 postgresql 中返回排除行的数量
- performance - 如何正确计算 CPU 和 GPU FLOPS 性能?
- drupal - Drupal 8 - 作曲家更新抛出错误
- embedded - STM32 USB CDC Rx 中断
- javascript - MySQL 仅获取 3 列之间条件的第一个匹配项
- python-3.x - 在 Python 中管理文件