在没有加速的情况下转向球员方向

时间:2017-12-03 15:55:47

标签: c# unity3d physics game-physics

我试图制作一个类似部落的游戏的小型原型,主要受到部落的启发: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)));

它的作用是低速运动到高速运动之间的训练。低速是很好的高速运动不按预期工作。当转动速度方向只转动一小部分然后它停止并且玩家继续沿着那个方向行进,除非我转动相机(在源游戏中有些类似于冲浪)。

我希望它能像T:A一样工作。我真的找不到任何好的参考视频,但它的主旨是你可以走到一边,减速但不加速。

对于知道如何修复它的人来说,我真的很感兴趣。提前致谢! :d

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题。它如此简单我觉得很傻。 我只是将movemultiplier改为:

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

基本上将cosign的东西抛弃到一个简单的角度。它现在按预期工作。