在对游戏对象施加力后采取最终位置



我对游戏对象施加了一个力,它按预期进行。我想在这个游戏对象的速度变为零时,取其最终位置。我使用这样的算法

     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 并且拍摄变为真。这就是为什么我采取起始位置而不是最终位置。但是,我需要在游戏对象消失后占据它的位置并变为零速度你能给我指个路吗?

将 shot 设为 int 而不是 bool 并将其设置为 0。拍摄时将其设置为 1,然后在更新中检测它何时大于 0,以检测它是否为真。当星等为0且射击为1时,将拍摄设为2,当星等为0且射击为2时,记录位置并将拍摄设置为0。注意:您可能需要将其移动到 FixedUpdate 方法中,以便它仅以与物理计算相同的速率发生。示例如下:

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) 之间的幅度

 void Shoot (){
    ...
    if(Mouse button clicked){
      gameobject.rigidbody.AddForce;
    }
 }
 void Update (){
    // First check shoot paramater for more performance
    if(shoot == false && ((gameobject.rigidbody.velocity.magnitude>0)
                      &&(gameobject.rigidbody.velocity.magnitude<=0.5))){ 
       Shoot();  //object start moving so do some job.
       shoot = true;  // the object is moving
       // now you can know your object has movement 
       // and also know  <=0.5 as you wish in comment.
    }else if(gameobject.rigidbody.velocity.magnitude==0 && shoot==true){
       finalPosition==gameobject.transform.position;
       shoot = false;
    }
 }

我认为下面是更好的解决方案。

首先在你的类或单独的类中创建枚举,以获得更合适和可读的代码。

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

也许代码中的一些语法错误。我不检查它。

最新更新