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