Unity3d 在施加于游戏对象的力后占据最终位置
我对一个游戏物体施加一个力,它就会按预期的那样进行。当这个游戏物体的速度为零时,我想确定它的最终位置。我使用这样的算法Unity3d 在施加于游戏对象的力后占据最终位置,unity3d,Unity3d,我对一个游戏物体施加一个力,它就会按预期的那样进行。当这个游戏物体的速度为零时,我想确定它的最终位置。我使用这样的算法 void Shoot () { ... if(Mouse button clicked) { gameobject.rigidbody.AddForce; shoot = true; } } void Update () { Shoot(); if(gameobject.rigidbody.v
void Shoot ()
{
...
if(Mouse button clicked)
{
gameobject.rigidbody.AddForce;
shoot = true;
}
}
void Update ()
{
Shoot();
if(gameobject.rigidbody.velocity.magnitude==0 && shoot==true)
{
finalPosition==gameobject.transform.position;
shoot = false;
}
}
然而,对于我刚刚拍摄的第一个瞬间帧(施加了力,但速度没有立即改变),速度==0,拍摄变为真。这就是我选择起始位置而不是最终位置的原因。但是,我需要在游戏对象变为零速度后选择其位置。你能告诉我一个方法吗?将射击设置为int而不是bool,并将其设置为0。当您拍摄时,将其设置为1,然后在更新中检测其是否大于0。当震级为0且放炮为1时,进行放炮2,然后当震级为0且放炮为2时,记录位置并将放炮设置为0。注意:您可能需要将其移动到FixeUpdate方法中,以便它仅以与物理计算相同的速率发生。示例如下:
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
//add you force
shoot = 1;
}
}
private void FixedUpdate()
{
Shoot();
if(shoot > 0 && gameobject.rigidbody.velocity.magnitude==0)
{
if (shoot == 1)
{
shoot = 2;
}
else
{
finalPosition==gameobject.transform.position;
shoot = 0;
}
}
}
由于下面的代码,您可以在(0,0.5)之间通知震级 在你的课堂上,你可以添加以下内容
public MovementState objectState = MovementState.Initial; //you can see this and changes in editor
void Shoot (){
...
if(Mouse button clicked){
objectState = MovementState.Initial;
gameobject.rigidbody.AddForce;
}
}
void Update (){
// First check shoot paramater for more performance
if(objectState == MovementState.Initial && ((gameobject.rigidbody.velocity.magnitude>0)
&&(gameobject.rigidbody.velocity.magnitude<=0.5))){
Shoot(); //object start moving so do some job.
objectState = MovementState.FirstMove;
// now you can know your object has movement
// and also know <=0.5 as you wish in comment.
}else if(objectState==MovementState.Moving && gameobject.rigidbody.velocity.magnitude==0){
finalPosition==gameobject.transform.position;
objectState = MovementState.Stop;
}else if(objectState==MovementState.FirstMove){
objectState = MovementState.Moving;
}
}
public MovementState objectState=MovementState.Initial;//您可以在编辑器中看到这一点和更改
空射(){
...
如果(单击鼠标按钮){
objectState=MovementState.Initial;
gameobject.rigidbody.AddForce;
}
}
无效更新(){
//首先检查射击参数以获得更高的性能
if(objectState==MovementState.Initial&((gameobject.rigidbody.velocity.magnity>0)
&&(gameobject.rigidbody.velocity.Magnitude这很精明!谢谢兄弟。我想再问你一件事。当速度在下一帧中不等于零时,你的解决方案是可以的。那么速度在5-10帧后而不是下一帧中变得不同于零呢?我不确定你的意思是什么?将代码放入固定更新意味着只有在物理计算完成后才会发生,在这一点上,震级不应该是零。想想看,我想做完全相同的事情。但是,我想检查的不是速度。震级==0,因为它是速度。震级
public enum MovementState {
Initial = 0,
FirstMove = 1,
Moving = 2,
Stop = 3
}
public MovementState objectState = MovementState.Initial; //you can see this and changes in editor
void Shoot (){
...
if(Mouse button clicked){
objectState = MovementState.Initial;
gameobject.rigidbody.AddForce;
}
}
void Update (){
// First check shoot paramater for more performance
if(objectState == MovementState.Initial && ((gameobject.rigidbody.velocity.magnitude>0)
&&(gameobject.rigidbody.velocity.magnitude<=0.5))){
Shoot(); //object start moving so do some job.
objectState = MovementState.FirstMove;
// now you can know your object has movement
// and also know <=0.5 as you wish in comment.
}else if(objectState==MovementState.Moving && gameobject.rigidbody.velocity.magnitude==0){
finalPosition==gameobject.transform.position;
objectState = MovementState.Stop;
}else if(objectState==MovementState.FirstMove){
objectState = MovementState.Moving;
}
}