我从未使用过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;
}
}
答案 0 :(得分:2)
有两件事因为力或扭矩不起作用: -
1)刚体的质量太高。所以你必须要么 改变它的质量或增加力量。例如,根据要求,移动具有质量为1单位的物体所需的力必须在100-200之间或更多。
2)当刚体被声明为运动学时,你只能使用脚本或动画来改变它的转换。如果你不希望刚体受到引力的影响并保持浮动,那么只需取消选中isGravity和isKinematic(这将使物体保持在空气中,也可以根据需要用力或扭矩对其进行影响。)。
答案 1 :(得分:1)
根据您的说明,您为刚性人员启用了isKinematic
选项
但是,如果你看一下Unitys的文档,它会说:
如果启用了isKinematic,则不会出现强制,碰撞或关节 再次影响刚体。刚体将完全控制 通过改变transform.position来动画或脚本控制。
除非你在脚本中使用transform.position
,否则基本上它不会移动。
答案 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> (); }