简体   繁体   English

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

[英]Unity 3D - Drag and Angular Drag not working

I'm using a boat script for unity 3d in javascript. 我正在使用划船脚本在javascript中实现统一3d。 It almost works perfectly except that the boat will never slow down and turning will cause an infinite turn unless you press the keys in opposite direction. 它几乎可以完美地工作,除了船永远不会减速,并且除非您向相反的方向按转键,否则转弯会导致无限转弯。 I tried adjusting the mass, drag and angular drag within the inspector for the boat object itself and I even added code for it in the script and it still has no effect. 我尝试在检查器中调整船对象本身的质量,阻力和角度阻力,甚至在脚本中添加了代码,但效果仍然无效。 There are no other scripts in the game except a smooth follow camera script also on the boat. 游戏中没有其他脚本,除了船上的平滑跟随摄像头脚本。

 #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");

 }

I hope it's something simple. 我希望这很简单。 Any help is appreciated. 任何帮助表示赞赏。

I feel like this problem could be caused by the use of 我觉得这个问题可能是由于使用

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

In my experience, it's best to add force to the rigidbody. 以我的经验,最好在刚体上加力。

As for the turning issue, do you ever reset the rudder position back to the default? 至于转弯问题,您是否曾经将舵位置重置为默认值? I can't seem to find where this would occur in your code. 我似乎无法在您的代码中找到这种情况。

Hope this helps 希望这可以帮助

I was able to solve it by directly slowing down the speed variable. 我能够通过直接降低速度变量来解决它。

    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;
                    }
            }

    }

I did the same thing for the rudder. 我对舵做了同样的事情。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM