2017-12-03 6 views
1

나는 주로 종족 : 승천 (Ascend)에 의해 영감을 받아 종족과 유사한 게임의 작은 프로토 타입을 만들려고 노력하고있다. 문제는 운동을하기 어렵다는 것입니다. 속도를 유지하기 위해 마찰없이 미끄러지는 스키가 문제가되지 않습니다. 반면에 공기/스키 컨트롤입니다. 내가하려고하는 것은 플레이어가 어떤 방향으로 속도를 높이 지 않고 고속으로 이동할 때 방향을 바꾸거나 속도를 늦추도록하는 것입니다. 속도를 높이 지 않고 플레이어의 방향을 바꾼다.

이에 사용하는 스크립트 메신저입니다 :

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class PlayerMovement : MonoBehaviour { 
    public Transform cameraObj; 
    public Transform cameraRefObj; 
    public Transform velObj; 
    public Camera cameraCam; 
    public Rigidbody rigbod; 
    public CapsuleCollider cap; 
    public float maxVel; 

    public float walkForce; 
    public float defDynFric; 
    public float defStatFric; 
    void Start() { 
     rigbod = this.GetComponent<Rigidbody>(); 
     cap = this.GetComponent<CapsuleCollider>(); 
     cameraObj = this.GetComponentInChildren<Camera>().transform; 
     cameraCam = this.GetComponentInChildren<Camera>(); 
    } 

    void Update() { 
     Vector3 vel = rigbod.velocity; 
     Debug.DrawRay(this.transform.position, vel); 
     Vector3 velCalc = new Vector3(vel.x, 0, vel.z); 
     float speedCapMult =Mathf.Clamp01(vel.magnitude/maxVel); 
     velObj.rotation = Quaternion.LookRotation(velCalc); 
     cameraRefObj.transform.rotation = Quaternion.EulerAngles(0, Quaternion.ToEulerAngles(cameraObj.rotation).y, 0); 
     if (Input.GetButton("Skii")) 
     { 
      cap.material.dynamicFriction = 0; 
      cap.material.staticFriction = 0; 
     } else 
     { 
      cap.material.dynamicFriction = defDynFric; 
      cap.material.staticFriction = defStatFric; 
     } 
     if (Input.GetAxis("Vertical") !=0 || Input.GetAxis("Horizontal") != 0) 
     { 
      Vector3 InputVec = Quaternion.EulerAngles(0, Quaternion.ToEulerAngles(cameraObj.rotation).y, 0) * Vector3.ClampMagnitude(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")),1); 
      float moveMulti =(1 -speedCapMult) +(speedCapMult*Mathf.Clamp01(1-Mathf.Cos(Vector3.Angle(velCalc, InputVec)/2))); 
      InputVec = Vector3.ClampMagnitude(InputVec, moveMulti); 
      Vector3 resVec = InputVec * (moveMulti * walkForce); 

      Debug.DrawRay(this.transform.position, resVec, Color.red); 
      // Debug.Log("SPD*: "+speedCapMult + " moveMulti: " + moveMulti + " VecAng: "+ Mathf.Clamp01(Mathf.Cos((Vector3.Angle(velCalc, InputVec)/2)-1))); 
      rigbod.AddForce(resVec); 
     } 
    } 
} 

오전 데 문제는이 라인을 중심으로 이해하는 것과 같습니다

float moveMulti =(1 -speedCapMult) +(speedCapMult*Mathf.Clamp01(1-Mathf.Cos(Vector3.Angle(velCalc, InputVec)/2))); 

그것이 무엇을하는 저속 사이 trainsition입니다 고속 동작으로의 이동. 저속은 의도 한대로 작동하지 않는 고속 동작입니다. 방향을 돌릴 때 작은 비트 만 돌리면 멈추고 플레이어가 카메라를 돌리지 않으면 플레이어가 그 방향으로 계속 여행합니다 (소스 게임에서 서핑하는 것처럼 보입니다).

T : A에서와 같이 작동하고 싶습니다. 나는 정말로 좋은 영상 비디오를 발견 할 수 없다. 그러나 그것의 요지는 당신이 옆으로 갈 수 있고, 속도를 늦추지 만 속도를 올릴 수 없다는 것이다.

이드는이를 수정하는 방법을 알고있는 사람에게 도움을 정말 감사합니다. 미리 감사드립니다! : D

+0

선형 속도가 아닌 각속도 만 변경하려면 대신 'rigbod.AddTorque'를 사용할 수 있습니다. 자세한 내용은 [Documentation page] (https://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html)를 참조하십시오. – meowgoesthedog

답변

0

나는이 문제를 해결할 수 있었다. 그게 너무 단순해서 바보 같아. 기본적으로 간단한 각도로 코사인 일을 죽겠다

  float moveMulti =(1 -speedCapMult) +(speedCapMult*Mathf.Clamp01(Vector3.Angle(velCalc, InputVec)/180)); 

: 은 단순히에 movemultiplier을 변경했습니다. 그것의 의도대로 작동합니다.

관련 문제