Unity中自带的第一人称与第三人称视角之间的切换问题

第一人称[_Characters],第三人称主角[_3rdPersonViewpoint];

第一人称视角与第三人称的差别在于鼠标旋转,经过测试在第三人称切换至第一人称时只要将3rd的localposition和localscale赋值给1fs就可以了,这是我自己定义的一个脚本ViewPoint.cs中

//第三人称切换至第一人称视角
if (Input.GetKey(KeyCode.F1))
{
//pre1fsAngle = cam_1fs.transform.eulerAngles.y;
//获取第三人称视角的绕Y轴旋转角度
pre1fsAngle = cam_3rd.transform.eulerAngles.y;
if (!Obj_1fs.activeSelf)
{
Obj_1fs.SetActive(true);
GameObject.Find("Main Character Controller").transform.localPosition = GameObject.Find("3rd Person Controller").transform.localPosition;
GameObject.Find("Main Character Controller").transform.localRotation = GameObject.Find("3rd Person Controller").transform.localRotation;
//gobj_1fs.transform.eulerAngles = new Vector3(cam_3rd.transform.eulerAngles.x, cam_3rd.transform.eulerAngles.y, cam_3rd.transform.eulerAngles.z);
Obj_3rd.SetActive(false);
//gobj_3rd.GetComponent().isControllable = false;

}
}
但是当第三人称切换至第一人称时就会出现问题,两个视角的主角位置可以同步,但是他们的运动方向没有办法直接同步,这个到底是什么原因,是的第三人称视角无法直接修改rotation值呢?
经过多次的尝试之后发现原因在于unity自带的第三人称角色控制脚本ThirdPersonController.js上出了问题:角色的朝向控制必须通过WASD等控制,所以在第一人称直接切换到第三人称时无论如何都没法直接修改朝向问题,大家可以尝试下,看下效果;
经过分析ThirdPersonController.js之后发现修改方案:必须修改targerDirection的值才可以改变朝向,但是前提是要获取到
//w(1) & s(-1)(前后运动)
v = Input.GetAxisRaw("Vertical");
//a(-1) & d(1)(左右运动)
h = Input.GetAxisRaw("Horizontal");
//print("print v:"+v+",h:"+h);

var targetDirection = h * right + v * forward;
//v和h的值,并且切换的过程应该是在将3rd的朝向调整后继续使用WASD来控制。
//所以我修改了ThirdPersonController.js如下:
//添加标识位:以便判断是否修改V、H值来修改主角朝向(运动方向)
public var flag = false;

function Awake ()
{
//目标移动方向
function UpdateSmoothedMovementDirection ()
{
var cameraTransform = Camera.main.transform;
var grounded = IsGrounded();

// Forward vector relative to the camera along the x-z plane 
var forward = cameraTransform.TransformDirection(Vector3.forward);
forward.y = 0;
forward = forward.normalized;

// Right vector relative to the camera
// Always orthogonal to the forward vector
var right = Vector3(forward.z, 0, -forward.x);
//falg=false,默认第三人称时直接使用WASD来控制主角,否则在第一人称切换到第三人称时的第一帧设置v、h修改主角朝向,之后继续使用WASD控制

if(!flag)
{
//w(1) & s(-1)(前后运动)
v = Input.GetAxisRaw("Vertical");
//a(-1) & d(1)(左右运动)
h = Input.GetAxisRaw("Horizontal");
//print("print v:"+v+",h:"+h);

}
else
{
//print("v:"+v+",h:"+h);
flag = false;
}

// Are we moving backwards or looking backwards
if (v < -0.2)
movingBack = true;
else
movingBack = false;

var wasMoving = isMoving;
//根据WASD来判断主角是否运动中
isMoving = Mathf.Abs (h) > 0.1 || Mathf.Abs (v) > 0.1;

// Target direction relative to the camera
//主角相对于相机的方向
var targetDirection = h * right + v * forward;
}
此时还要修改ViewPoint.cs中的脚本
//第一人称切换至第三人称视角
if (Input.GetKey(KeyCode.F2))
{
cur1fsAngle = cam_1fs.transform.eulerAngles.y;
if (!Obj_3rd.activeSelf)
{
Obj_3rd.SetActive(true);
GameObject.Find("3rd Person Controller").transform.localPosition = GameObject.Find("Main Character Controller").transform.localPosition;
//Obj_3rd.transform.eulerAngles = new Vector3(0, cam_1fs.transform.eulerAngles.y, 0);
//gobj_3rd.transform.eulerAngles = new Vector3(0, cam_1fs.transform.eulerAngles.y, 0);
//cam_3rd.transform.eulerAngles = new Vector3(0, cam_1fs.transform.eulerAngles.y, 0);
//将角度值转化成弧度值
float angle = (cur1fsAngle - pre1fsAngle) * Mathf.PI / 180;
//Mathf.Cos(弧度),修改第三人称角色控制器的V、H值来修改主角的朝向(运动方向)
gobj_3rd.GetComponent().v = Mathf.Cos(angle);
gobj_3rd.GetComponent().h = Mathf.Sin(angle);
print("旋转角度:" + (cur1fsAngle-pre1fsAngle));
//设置第三人称角色控制器中的标识:用来判断是否修改V、H值
gobj_3rd.GetComponent().flag = true;
Obj_1fs.SetActive(false);
}
}
此时就可以针对这两个视角进行比较不错的切换了!

你可能感兴趣的:(Unity3D)