Unity 3D - 拖动和角度拖动不起作用

时间:2016-01-04 03:07:17

标签: javascript unity3d 3d physics drag

我在javascript中使用船形脚本来统一3d。它几乎完美无缺,除了你不会减速和转弯将导致无限转弯,除非你按相反方向的按键。我尝试在检查器中调整船对象本身的质量,阻力和角度拖动,我甚至在脚本中添加了代码,但它仍然没有效果。游戏中没有其他脚本,除了船上还有平滑的跟踪相机脚本。

 #pragma strict

 var speed : float = 1.0;

 var acceleration : float = 1.0;

 var maxspeed : float = 2.0;

 var minspeed : float = -0.25;

 var heading : float = 0.0;

 var rudder : float = 0.0;

 var rudderDelta : float = 2.0;

 var maxRudder : float = 6.0;

 var bob : float = 0.1;

 var bobFrequency : float = 0.2;

 var rb: Rigidbody;

 private var elapsed : float = 0.0;

 private var seaLevel : float = 0.0;

 private var rudderControl : GameObject;

 private var rudderAngle : float = 0.0;

  function signedSqrt( x : float){

     var r = Mathf.Sqrt(Mathf.Abs( x ));

     if( x < 0 ){

         return -r;

     } else {

          return r;

     }

 } 


 function Start () {
    rb = GetComponent.<Rigidbody>();
} 


 function Update () {

 rb.angularDrag = 0.8;
 rb.drag = 1;

 // Bobbing

 elapsed += Time.deltaTime;

 transform.position.y = seaLevel + bob * Mathf.Sin(elapsed * bobFrequency * (Mathf.PI * 2));

 // Steering

 rudder += Input.GetAxis("Horizontal") * rudderDelta * Time.deltaTime;

 if( rudder > maxRudder ){

     rudder = maxRudder;

 } else if ( rudder < -maxRudder ){

     rudder = -maxRudder;
 }

 heading = (heading + rudder * Time.deltaTime * signedSqrt(speed)) % 360;

 // transform.Rotate(0, rudder * Time.deltaTime, 0);

 transform.eulerAngles.y = heading;

 transform.eulerAngles.z = -rudder;

 if( rudderControl ){

    rudderAngle = ((-60 * rudder)/maxRudder + heading) % 360;

    //rudderControl.transform.localEulerAngles.y = (70 * rudderAngle)     %     360;

        rudderControl.transform.eulerAngles = Vector3(0, rudderAngle, 0);
     }

     // Sail

     speed += Input.GetAxis("Vertical") * acceleration * Time.deltaTime;

     if( speed > maxspeed ){

             speed = maxspeed;

    }     else if ( speed < minspeed ){

        speed = minspeed;

     }

    transform.Translate(0, 0, speed * Time.deltaTime);

 }

 function Awake (){

     seaLevel = transform.position.y;

     rudderControl = GameObject.Find("rudderControl");

 }

我希望它简单明了。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

我觉得这个问题可能是由

引起的
transform.Translate(0, 0, speed * Time.deltaTime);

根据我的经验,最好给刚性体增加力量。

至于转弯问题,您是否曾将方向舵位置重置为默认值?我似乎无法找到代码中的这种情况。

希望这有帮助

答案 1 :(得分:0)

我能够通过直接减慢速度变量来解决它。

    if (!Input.GetAxis("Vertical"))
    {

        if (speed > 0 )
            {
                speed -= 0.1f;
                if ( speed < 0 )
                    {
                        speed = 0;
                    }
            }


        if (speed < 0 )
            {
                speed += 0.1f;
                if ( speed > 0 )
                    {
                        speed = 0;
                    }
            }

    }

我为方向舵做了同样的事情。