2017-12-13 1 views
0

나는 나의 FPS 문자 이동하려면이 코드를 사용다른 앞으로, 뒤로 및 기총 소사 속도

CharacterController controller; 

void Awake() 
{ 
    reference = new GameObject().transform; 
} 
void Update() 
{ 
    controller.Move (moveDirection * Time.deltaTime); 
    reference.eulerAngles = new Vector3(0, mycamera.eulerAngles.y, 0); 
    forward = reference.forward; 
    right = new Vector3(forward.z, 0, -forward.x); 
    float hor = Input.GetAxisRaw("Horizontal"); 
    float ver = Input.GetAxisRaw("Vertical"); 
    targetDirection = (hor * right) + (ver * forward); 
    targetDirection = targetDirection.normalized; 
    targetVelocity = targetDirection; 

    if (inputDetected) 
    { 
     targetVelocity *= speed; 
     moveDirection.z = targetVelocity.z; 
     moveDirection.x = targetVelocity.x; 
    } 
} 

이 잘 작동을하지만, 내 캐릭터가 다른 뒤로 기대하고 기총 소사 속도를 갖고 싶어. 나는 targetVelocity.x *= speed1;targetVelocity.z *= speed2;을 시도했지만 작동하지 않았다. 마우스를 움직이면 앞쪽 키를 누를 때 캐릭터는 더 이상 앞으로 나아 가지 않습니다.

답변

0

앞으로가 속도 벡터의 z 값과 같지 않으므로 작동하지 않습니다. 속도 벡터의 값은 월드 공간 값입니다.

원하는 것을 얻기위한 가장 쉬운 방법은 입력에 직접 속도 차이를 적용하는 것입니다. 예 (아니 최고의 솔루션 있지만, 단지 당신에게 빠른 아이디어를 제공하기 위해)

float ver = Input.GetAxisRaw("Vertical"); //-1 to 1 
float forwardSpeedMultiplier = 1f; 
float backwardSpeedMultiplier = .6f; 

//If input >= 0 then use forwardspeed multiplier 
// else use backwardspeedmultiplier 
float speedMultiplier = (ver >= 0) ? forwardSpeed: backwardSpeed; 

//Multiply input value with the multiplier 
ver *= speedMultiplier; 

편집을 위해

는 여기에 더 나은 버전에게 제안을

public class Move : MonoBehaviour { 
    public float forwardMultiplier = 1.2f; 
    public float backwardMultiplier = .5f; 
    public float sidewardMultiplier = .7f; 
    public float speed = 5f; 

    private Rigidbody rb; 

    // Use this for initialization 
    void Start() { 
     rb = GetComponent<Rigidbody>(); 
    } 

    // Update is called once per frame 
    void Update() { 
     var input = transform.rotation * new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));   
     var dotResult = Vector3.Dot(input.normalized, transform.forward); 
     var speedMultiplier = (dotResult >= 0) ? Mathf.Lerp(sidewardMultiplier, forwardMultiplier, dotResult) : Mathf.Lerp(sidewardMultiplier, backwardMultiplier, Mathf.Abs(dotResult)); 
     var movementVector = input * speed * speedMultiplier; 
     movementVector.y = rb.velocity.y; 
     rb.velocity = movementVector; 
    } 
} 
+0

감사합니다 그래서. 'targetDirection = targetDirection.normalized;도 제거해야 작동합니다. 왜 이것이 최선의 해결책이 아니라고 말합니까? 단점은 무엇입니까? – binoculars

+1

@binoculars 혼란을 가져 주어서 유감스럽게도, 필자는 필연적으로 기본 버전이 아니라는 것을 의미하지는 않았다. 더 최적의 솔루션을 위해 나는 (테스트되지 않은) 방향으로 생각하고있다. \t \t var forwardMultiplier = 1f; \t var sideMultiplier = .8f; \t var backwardMultiplier = .3f; \t var inputVector = transform.rotation * new Vector3 (hor, 0, ver); \t var forward = transform.forward; \t var dotResult = Vector3.Dot (inputVector.normalized, forward); \t var speedMultiplier = (dotResult> = 0)? Mathf.Lerp (sideMultiplier, forwardMultiplier, dotResult) : Mathf.Lerp (backwardMultiplier, sideMultiplier, dotResult); – bramve

관련 문제