これですこれ。
まあそのとおりやれば出来ます。
UnityARHitTestExample.csにupdate()内に
if (Input.touchCount > 0 && cam != null) { //CreatePrimitiveで動的にGameObjectであるCubeを生成する GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); //Cubeに適用するランダムな色を生成する Material material = new Material(Shader.Find("Diffuse")) { color = new Color(Random.value, Random.value, Random.value) }; //ランダムに変化する色をCubeに適用する cube.GetComponent<Renderer>().material = material; //端末をタップして、ランダムな色のCubeを認識した平面上に投げ出すように追加していく //Cubeの大きさも0.2fとして指定している cube.transform.position = cam.transform.TransformPoint(0, 0, 0.5f); // cube.transform.position = cam.transform.TransformPoint(0.5f, 0, 0); cube.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f); //CubeにはRigidbodyを持たせて重力を与えておかないと、床の上には配置されないので注意が必要。Rigidbodyで重力を持たせないとCubeは宙に浮いた状態になる cube.AddComponent<Rigidbody>(); //これでタップしたときに斜め上にキューブ飛んでいく?そして衝突計算 cube.GetComponent<Rigidbody>().AddForce(cam.transform.TransformDirection(0,1f,2f),ForceMode.Impulse); // cube.GetComponent<Rigidbody>().AddForce(cam.transform.TransformDirection(2f, 0, 0),ForceMode.Impulse); }
と書きます、と。 その際に、
#if UNITY_EDITOR #endif
も消す必要あったので注意。たぶんupdateの最初と最後に書かれてるのですが、そのままでやったら動作しませんでした。
// cube.transform.position = cam.transform.TransformPoint(0.5f, 0, 0);
は私が追加した部分で、数値変えたら何起きるのかなー、って試したのでした。
これはCubeが生まれるポジション、ですね。
カメラ基準でどこから出てくるか、って感じでした。
元々はz軸で0.5fなんで、カメラの奥の方向に少しいったところからCubeが生まれます。
// cube.GetComponent<Rigidbody>().AddForce(cam.transform.TransformDirection(2f, 0, 0),ForceMode.Impulse);
これも私が追加した部分で、
これはCubeが生まれるときに飛ぶ方向、でした。
正確に言うと
AddForce(cam.transform.TransformDirection(2f, 0, 0), ForceMode.Impulse);
ここがそれを指します。
ForceMode.lmpulseはよくわかんなかったです。
で、このサンプルだとARKit1.0なんで、平面だけなんですけど、ARKit1.5以降なら、ちゃんと垂直も認識し、かつ認識したところを跳ね返ります。
でもそれだとまだ現実的というか、現実で壁にキューブ投げて床に落ちてるだけなんで、せっかくAR空間なんで非現実的にしたいなと思ったので、重力を変えてみました。
なんかコード色々書かなきゃなのかなあ、と思っていたら
Unity上でちょちょいと設定いじるだけでした。
これで、Z方向にマイナスに飛んでいきます。
https://qiita.com/jordan710k/items/568c17d1f3e2d763544b
なんかたぶんカメラ起動したときに軸決まるから、そのときのZ軸の負の方向に重力かかる、と思います。
意外と簡単だった。