LoginSignup
0
2

More than 5 years have passed since last update.

【Unity(C#)】ゲームオブジェクトをA地点→B地点まで動そうとしたら失敗した話

Last updated at Posted at 2018-11-25

  
  
  
この記事は

『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』

の記事です。そのつもりでお読みください。

  
先に言っときますと、unityにはアニメーションという機能がありますので、
ただ二点間を移動させたいならアニメーションで再現したほうが圧倒的に効率が良いです。

じゃあ、なんでこんなことをしようと思ったかというと
当時の自分は覚えたことだけでなんとかしようとしてたからです。

もっと楽にできんのか?めんどくさすぎる。

という気持ちが大事だと痛感しました。
  
  

"A地点とB地点の差"がゼロになるまでループ(加算代入、減算代入)させる

 //遠くに置いたmoveObjectをgoalPointのある座標まで移動させる

    public GameObject moveObject; 
    public GameObject goalPoint;

    Vector3 move_Position;
    Vector3 toGoPoint;

    float moveSpeed = 0.01f; //移動速度 

    void Start()
    {
        move_Position = moveObject.transform.position; //移動させたいオブジェクトの座標
        toGoPoint = goalPoint.transform.position;      //目的地に設置したオブジェクトの座標
    }

    void Update()
    {
        if (move_Position.z > toGoPoint.z)
        {
            move_Position.z -= moveSpeed;
            moveObject.transform.position = move_Position;
        }

    }

ちゃんと移動してくれたんですが、ぴったりと目的地に設置したオブジェクトと重なりませんでした。
なぜ重ならないのか調べるために、二点間の距離をprint();で表示してみました。
浮動小数点 循環.png

途中で細かい数字ですがズレているのがわかりました。

浮動小数点数型のズレ

参考サイト:小数(浮動小数点数型)の計算が思った結果にならない理由と解決法

↑ 10進数の小数を2進数に変換すると同じ数字が永遠に循環してしまうそうです。
そのため、小数は限りなくその数字に近い数値として丸められるとのことでした。
なのでループで何百回も回した結果、誤差が生じてしまったのだと思います。たぶん。

あと、このやり方だと
"移動させたいオブジェクトの座標の方が目的地に設置したオブジェクトの座標より小さい場合"
"Y座標もX座標も移動させたい場合"
などいろいろ問題が出てきて非常にめんどくさいです。

楽なやり方でやりましょう。
アニメーションは今度まとめまーす。

0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2