【问题标题】:Take final position after a force applied to a GameObject在对游戏对象施加力后采取最终位置
【发布时间】:2015-01-28 15:11:59
【问题描述】:

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

     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 并且拍摄变为真实。这就是为什么我取起始位置而不是最终位置的原因。但是,我需要在 GameObject 走后变成零速度后取它的位置,你能告诉我一个方法吗?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    将拍摄设置为 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;
            }
        }
    }
    

    【讨论】:

    • 它是精明的!多谢兄弟。我还想问你一件事。当下一帧中的速度不为零时,您的解决方案是可以的。速度在 5 到 10 帧之后而不是下一帧中变得不为零怎么办?
    • 我不确定你的意思?将代码置于固定更新中意味着在进行物理计算之前不应进行检查,此时幅度不应为零。
    • 想一想,我想做完全相同的事情。但是,我想检查的不是velocity.magnitude==0,因为它是velocity.magnitude
    【解决方案2】:

    感谢下面的代码,您可以在 (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;
        }
     }
    

    代码中可能存在一些语法错误。我不检查它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多