第一人称[_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<ThirdPersonController>().isControllable = false; } }但是当第三人称切换至第一人称时就会出现问题,两个视角的主角位置可以同步,但是他们的运动方向没有办法直接同步,这个到底是什么原因,是的第三人称视角无法直接修改rotation值呢?
//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来控制。
//添加标识位:以便判断是否修改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<ThirdPersonController>().v = Mathf.Cos(angle); gobj_3rd.GetComponent<ThirdPersonController>().h = Mathf.Sin(angle); print("旋转角度:" + (cur1fsAngle-pre1fsAngle)); //设置第三人称角色控制器中的标识:用来判断是否修改V、H值 gobj_3rd.GetComponent<ThirdPersonController>().flag = true; Obj_1fs.SetActive(false); } }此时就可以针对这两个视角进行比较不错的切换了!