青いやつの進捗日記。

べんきょうのしんちょくをかいていきます。プログラミング初心者。

ARKit 1.5で垂直認識、してタップしたらそこに選択した絵が出る、っていう英語のYoutubeのチュートリアルやった。ARKit 1.5 & Unity Tutorial - Vertical Plane detection (Place Paintings on the wall)

www.youtube.com

これです。

いやはや、英語だから何言ってるかわかんないけど映像見たとおりやればだいたいできるから便利だった。わかりやすい。


Unity-Technologies / Unity-ARKit-Plugin / spring2018_update — Bitbucket ここからARKit 1.5に対応したUnity ARKit Pluginがダウンロード出来るのでします。

で、UnityARKitSceneを開きます。 f:id:XxGodmoonxX:20180724034058p:plain

iOSにSwitch Platformしたり諸々の設定をします。


で、この映像のチュートリアルの通りならば、画像を3枚ダウンロードします。まあなんでも大丈夫です。 絵画っぽいほうが壁に絵画がかかる、みたいで見た目いい、くらいの理由だと思います。

で、そのダウンロードした3枚の画像をAssets以下に直接ドラッグアンドドロップします。
imagesというフォルダを作り、その後3枚の画像をまとめます。 f:id:XxGodmoonxX:20180724035345p:plain


そして、今後はmaterialsという名前のフォルダを作ります。
その中にmaterialを3つ作成します。 f:id:XxGodmoonxX:20180724035206p:plain からの、Shader > Legacy Shaders > Diffuse を開き、
None(texture)となっているところでそれぞれさっきの画像を指定。
からの、Shader > UI > Default にしておきます。 f:id:XxGodmoonxX:20180724035617p:plain

次に、Hierarchyの方で、HitcubeParent > Hitcube を消します。
オフにするだけでもいいと思います。
そのHitcubeParentの中に、 3DObject > Plane を3個作ります。
それぞれをframe1~3で名前をつけます。

その3つが全部Scene上で被ってるので、ずらしてあげます。
で、Scene上の白い四角に、 Assets > materials の中の画像3つをそれぞれドラッグアンドドロップします。 f:id:XxGodmoonxX:20180724040949p:plain


次に、HierarchyのUnityARKitSceneにUI > Canvas を作ります。
で、Canvas内にUI > Imageを作ります。で、Canvas横いっぱいに広げます。
私的には、Game画面で、Aspect比をFree Aspectじゃなくて、
iPhone7で作るならその比の設定を作っておいて、それでやったほうが、
ぴったり作れるのでいいと思います。 f:id:XxGodmoonxX:20180724042003p:plain で、Anchor Presetsを設定します。意味よくわかってないんですよねこれ。たぶんUIの移動関連のなんかです…

で、Canvas内にUI > Buttonを作ります。
Button > Text は消しちゃって大丈夫です。
そのButtonを選択し、Inspector内でImage(Script)を見ます。
Source ImageをNoneを選択します。
Materialで先程の画像を選びます。 f:id:XxGodmoonxX:20180724042810p:plain

で、SceneでこのButtonを移動してあげて、さっきの白い範囲内に収まるように移動します。大きさも適宜変えます。 f:id:XxGodmoonxX:20180724043128p:plain


HitcubeParent > frame1に戻り、
Add Component > Unity AR Hit Test Example を開き、
Hit TransformがNoneになっていると思うのですが、そこに
HitcubeParent > frame1をドラッグアンドドロップします。 f:id:XxGodmoonxX:20180724043611p:plain それを3つ分やります。

で、その後Unity AR Hit Test Exampleのチェックを外します。
(これってなんで外すんですかね、今なにがしたかったの…って気持ちになりました)


次に、HitcubeParentを開き、
InspectorでAdd Component でChooseFrameという新しいScriptを作成します。
で、そのScript(ChooseFrame.cs)を開きます。

public class ChooseFrame : MonoBehaiviour {

  //ここに書く
 
  void start() {

ここに書くってとこに、

public GameObject frame1;
public GameObject frame2;
public GameObject frame3;

と書きます。

で、もう1回hitcubeParentを見てみると、
Frame1, Frame2, Frame3という3つが出来ていると思います。
それぞれNone(Game Object)になっているので、そこに
Hierarchy内のFrame1をChooseFrameのFrame1にドラッグアンドドロップします。 f:id:XxGodmoonxX:20180724045205p:plain


次に、またChooseFrame.csを開き、

    void update() {
    }

    //ここに書く

}

ここに書くに、

   public void Frame1() {
        frame1.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = true;
        frame2.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = false;
        frame3.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = false;
    }

    public void Frame2() {
        frame1.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = false;
        frame2.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = true;
        frame3.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = false;
    }

    public void Frame3() {
        frame1.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = false;
        frame2.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = false;
        frame3.GetComponent<UnityEngine.XR.iOS.UnityARHitTestExample> ().enabled = true;
    }

と書きます。

Cancas > frame1を開くと、On Click()というところがあると思います。
List is Emptyとなっているところを+で開き、
そこのNone(Object)に、HitcubeParentをドラッグアンドドロップします。
No Functionとなっているところを、
ChooseFrame > Frame1()
を選びます。 これも画像3つ分やります。 f:id:XxGodmoonxX:20180724110516p:plain


次に、UnityARHitTestExample.csを開きます。

using UnityEngine.EventSystems;

を上の方にusingが並んでるところに追加します。
正直よくわかってないですけど、
イベント送信とかそういう系のなんか使いますよー、みたいな感じだと思います…

で、次に

        }
    }
    return false;
}

//ここに書く

void update() {

ここに書くに、

private bool IsPointerOverUIObject() {
    PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
    eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    List<RaycastResult> results = new List<RaycastResult>();
    EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
    return results.Count > 0;
}

を書きます。

そして、update内の#else以降、

if (touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved)

を、

if ((touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved) && !IsPointerOverUIObject())

に修正します。
(タッチし始めもしくはタッチしながら動いた時)且つIsPointerOberUIObjectじゃないとき。
どういうことなんですかね。


ここまでやったら、あとはUnityARKitSceneをBuildしてiPhoneで試すのみです。