我在尝试使用Unity3D项目时遇到问题。
这包括两个游戏摄像头,第三人称摄像头和RTS摄像头,以及一个摄像头管理器,可以处理两者之间的切换。
两个相机都有一个公共变量currentDistance
,因此管理员可以根据相机与用户的距离处理不同模式之间的切换。
例如,如果处于第三人称模式的用户缩小超过9.5(最大值为10),则禁用第三方摄像头并启用RTS。
或者对于RTS到第三人模式,RTS相机必须放大到> 48.f
要从RTS模式切换回第3人,用户必须缩小至48.0f。这是问题发生的地方,因为相机在启用和禁用之间来回滑动。
据我所知,这是因为相机的最后位置仍然在开关阈值范围内,所以当任一相机激活它时会触发开关,但是我无法理解的是我需要的逻辑以便阻止这种情况发生。我试着简单地重置每个摄像机的高度或距离,但这样可以防止我卡在我碰巧碰到的任何相机中。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class CameraManager : MonoBehaviour {
public GameObject thirdpersonCamera;
public GameObject rtsCamera;
private WoWCamera thirdPersoncam;
private RTSCam rtscam;
public float RTS_MODE_THRESHOLD = 9.5f;
public float THIRD_PERSON_MODE_THRESHOLD = 48.0f;
// Use this for initialization
void Start ()
{
thirdpersonCamera = GameObject.FindGameObjectWithTag ("MainCamera");
rtsCamera = GameObject.FindGameObjectWithTag ("RTSCam");
thirdPersoncam = thirdpersonCamera.GetComponent<WoWCamera> ();
rtscam = rtsCamera.GetComponent<RTSCam> ();
//disable RTS cam by default, only activate it when the user zooms out past the RTS_MODE_THRESHOLD
rtsCamera.SetActive (false);
}
// Update is called once per frame
void Update ()
{
int cameraID = DetermineActiveCamera ();
if (cameraID == 1 && thirdPersoncam.currentDistance > RTS_MODE_THRESHOLD) {
//player is in third person mode and has zoomed out switch to RTS Cam
//todo: need to reset cameras distance so it doesnt flip between them
rtscam.ResetHeight();
//thirdPersoncam.currentDistance = 8.0f;
thirdpersonCamera.SetActive (false);
rtsCamera.SetActive (true);
}else if (cameraID == 2 && rtscam.currentHeight < THIRD_PERSON_MODE_THRESHOLD) {
Debug.Log ("rts cam distance " + rtscam.currentHeight + " and threshold " + THIRD_PERSON_MODE_THRESHOLD);
//player is in RTS mode and has zoomed in switch to Third person camera
rtsCamera.SetActive (false);
thirdpersonCamera.SetActive (true);
}
}
//return 1 for thirdperosn camera 2 for rts, 0 for niether
int DetermineActiveCamera()
{
if (thirdpersonCamera.activeInHierarchy != false) {
return 1;
} else if (rtsCamera.activeInHierarchy != false) {
return 2;
}
return 0;
}
}
对于长篇大论的问题,我很抱歉,我只想提供尽可能多的信息。
编辑:就像添加因为似乎有些混乱,我确实有 ONE 脚本来控制哪个摄像头在任何时候都处于活动状态。不同之处在于每个Camera都有自己的脚本来控制它们对按键的响应方式和public currentDistance变量。 (因为RTS凸轮只需要测量它在玩家上方的高度,所以第三人称相机需要测量它有多远) 感谢