我在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");
}
我希望它简单明了。任何帮助表示赞赏。
答案 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;
}
}
}
我为方向舵做了同样的事情。