Unityで持参した第一人称と第三人称の視点の切り替え問題

4002 ワード

一人称[_Characters]、三人称主役[_3rdPersonViewpoint];
第一人称の視点と第三人称の違いはマウスの回転であり、第三人称が第一人称に切り替わるときに3 rdのlocalpositionとlocalscaleを1 fsに割り当てるだけでテストされた.これは私自身が定義したスクリプトである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;

}
}
しかし、第3人称が第1人称に切り替わると問題が発生し、2つの視点の主役の位置は同期できるが、彼らの運動方向は直接同期できない.これはいったい何の原因で、第3人称の視点がrotation値を直接修正できないのだろうか.
何度も試した結果、unityが持っている3人称キャラクタコントロールスクリプトが原因であることが分かった.jsで問題が発生しました:キャラクターの向き制御はWASDなどの制御を通過しなければならないので、第一人称が直接第三人称に切り替わる時どうしても向き問題を直接修正することができなくて、みんなは試して、効果を見ることができます;
分析した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の値であり、切り替えのプロセスは、3 rdの向きを調整した後も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);
}
}
この時点で、この2つの視点を比較的によく切り替えることができます!