AddForce不工作Unity

时间:2016-01-19 19:12:30

标签: javascript unity3d

我从未使用过isKinematic属性,该对象有8个轮对撞机,对象质量为20000。

我尝试了每一个组合;我使用x y z来增加力量,  Obj.GetComponent.<Rigidbody>().AddRelativeTorque( V*(spd)*1000, 0,0);, 但他们都没有工作!飞机停了下来。

可能是什么问题?

这是我的代码:

var Obj : Rigidbody;
var zrotForce : int = 1;
var MaxRot : int = 90;
var MinRot : int = -90;
var rotupForce : int = 1;
var speed : float;
var speedincrease : float;
var speeddecrease : float;
var Maxspeed : int;
var Minspeed : int;
var takeoffspeed : int;
var lift : int;
var minlift : int;
var hit = false;
function Start () {

    InvokeRepeating("Speed", .1, .1);
}

function Speed(){

if (Input.GetKey(KeyCode.Space)){
Mathf.Repeat(1,Time.time);
    speed=speed+speedincrease;
    }
if (Input.GetKey(KeyCode.LeftAlt)){
Mathf.Repeat(1,Time.time);
    speed=speed-speeddecrease;
    }
}

function Update () {
var spd = Obj.velocity.magnitude;
    //Obj.GetComponent.<Rigidbody>().AddRelativeForce(0,0,-speed);
    H=(Input.GetAxis ("Horizontal"))*zrotForce;
    if (H){
    Obj.GetComponent.<Rigidbody>().AddRelativeTorque(H*(spd/100), 0, 0);
    }
    V=(Input.GetAxis ("Vertical"))*rotupForce;
    if (V){

    Obj.GetComponent.<Rigidbody>().AddRelativeTorque( V*(spd)*1000, 0,0);
    }

    if(Maxspeed<=speed){
    speed=Maxspeed;
    }else{
    speed=speed;
    }
    if(Minspeed>=speed){
    speed=Minspeed;
    }else{
    speed=speed;
    }
        if (speed<takeoffspeed){
    Obj.GetComponent.<Rigidbody>().AddForce(0,minlift,0);

    }
    if(speed>takeoffspeed){
    Obj.GetComponent.<Rigidbody>().AddForce(0,lift,0);
    }
    if (Obj.GetComponent.<Rigidbody>().rotation.z>MaxRot){
    Obj.GetComponent.<Rigidbody>().rotation.z=MaxRot;
    }
    if (Obj.GetComponent.<Rigidbody>().rotation.z<MinRot){
    Obj.GetComponent.<Rigidbody>().rotation.z=MinRot;
    }
}

3 个答案:

答案 0 :(得分:2)

有两件事因为力或扭矩不起作用: -

1)刚体的质量太高。所以你必须要么 改变它的质量或增加力量。例如,根据要求,移动具有质量为1单位的物体所需的力必须在100-200之间或更多。

2)当刚体被声明为运动学时,你只能使用脚本或动画来改变它的转换。如果你不希望刚体受到引力的影响并保持浮动,那么只需取消选中isGravity和isKinematic(这将使物体保持在空气中,也可以根据需要用力或扭矩对其进行影响。)。

答案 1 :(得分:1)

根据您的说明,您为刚性人员启用了isKinematic选项 但是,如果你看一下Unitys的文档,它会说:

  

如果启用了isKinematic,则不会出现强制,碰撞或关节   再次影响刚体。刚体将完全控制   通过改变transform.position来动画或脚本控制。

除非你在脚本中使用transform.position,否则基本上它不会移动。

参考:please keep the reference

答案 2 :(得分:0)

Unity并不喜欢大众。根据他们的文档,你真的不应该超过10岁。我个人创建了一种比例,因此10是游戏中最重的对象,0仍然是0。

另外,只是一个建议,我不会GetComponent&lt;&gt;每一帧,当你更多地构建你的游戏时,这将变得浪费。这样做通常会更好:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_blood_glucose_record);

    mItemSelectedMessageTemplate =
            getString(R.string.spinner_message_template);
    Spinner spinner = (Spinner) findViewById(R.id.measured_time);
    spinner.setOnItemSelectedListener(new SpinnerInfo());

    dateFormatter = new SimpleDateFormat("yyyy-MM-dd", Locale.TRADITIONAL_CHINESE);
    findViewsById();


    setDateTimeField();
    timeFormatter = new SimpleDateFormat("hh:mm",Locale.TRADITIONAL_CHINESE);
    findViewsById();
    setTimeField();


    editPatientID = (EditText) findViewById(R.id.editPatientID);
    edit_sugar_con = (EditText) findViewById(R.id.edit_sugar_con);
}


private void setDateTimeField() {
    btnSelectDate.setOnClickListener(this);
    //editTime.setOnClickListener(this);

    Calendar newCalendar = Calendar.getInstance();
    DatePickerDialog = new DatePickerDialog(this, new android.app.DatePickerDialog.OnDateSetListener() {

        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            Calendar newDate = Calendar.getInstance();
            newDate.set(year, monthOfYear, dayOfMonth);
                btnSelectDate.setText(dateFormatter.format(newDate.getTime()));
            }

        }, newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH), newCalendar.get(Calendar.DAY_OF_MONTH));
    }

private void setTimeField(){

    btnSelectTime.setOnClickListener(this);
    Calendar newCalendar = Calendar.getInstance();
    TimePickerDialog = new TimePickerDialog(this, new android.app.TimePickerDialog.OnTimeSetListener(){

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            Calendar newTime = Calendar.getInstance();
            newTime.set(hourOfDay, minute);
                btnSelectDate.setText(timeFormatter.format(newTime.getTime()));
            }
        }, newCalendar.get(Calendar.HOUR_OF_DAY), newCalendar.get(Calendar.MINUTE));

    }

从你的Update()那里你可以调用

private RigidBody rigidBody;

void Start () { rigidBody = gameObject.GetComponent<RigidBody> (); }