質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.05%

unity タッチに合わせて自機が移動する仕組みを作りたい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,057

dousuruyo

score 26

前提・実現したいこと

シューティングゲームの開発を行っています
タッチ・スライドに合わせて自機が移動する仕組みを作りたいです
スライドしたぶんだけ自機がその方向に移動する感じです

発生している問題

一度、別のネットに落ちてたソースコードをもってきてそれで実現できたのですが、(引用元のリンクは、忘却の彼方へ過ぎました。。)
ほかの部分を色々修正してるうちに、再度移動のところの確認をしたところ、自機が画面から表示されなくなりました

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 自機コントローラ
/// </summary>
public class JikiController : MonoBehaviour {
    public GameObject bulletPrefab;
    private float timeElapsed;
    private Vector3 touchPosition;

    public float mouseSensitivity = 5f;//マウスの感度
    public float distanceToCamera = 10f;//カメラとプレイヤーの距離
    public float goRotationSmooth = 20f;//目標角度に向かう時の速さ
    public float outRotationSmooth = 3f;//元の角度に向かう時の速さ
    public float slope = 30f;//目標角度
    Vector3 playerPointInViewport;//プレーヤーのビューポート座標
    Vector3 mouseMovement;//マウスの移動量
    private Touch touch;//タップのデータ
    private Vector3 touchPoint;//タップした場所
    private float touchMovementX;//タッチの移動量x
    private float touchMovementY;//タッチの移動量y

    // Use this for initialization;
    void Start () {
        transform.rotation = Camera.main.transform.rotation;
        transform.position = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, distanceToCamera));
        //初期値の決定
        Debug.Log("初期位置:"+ transform.position);
    }

    // Update is called once per frame
    void Update() {
        timeElapsed += Time.deltaTime;

        //相対移動
        if (Application.platform == RuntimePlatform.WindowsEditor) {
            OnMouseDrag();
        }
        else {
            OnTouchDrag();
        }

        // androidのときは1秒ごと発射
        if (timeElapsed >= 0.5f) {
            //Instantiate(bulletPrefab, transform.position, Quaternion.identity);

            timeElapsed = 0.0f;
        }
    }

    /// <summary>
    /// 自機移動(エミュ 角度変更機能あり)
    /// </summary>
    void OnMouseDrag() {
        //もしマウスが押されたとき
        if (Input.GetMouseButton(0)){
            transform.position = Camera.main.ViewportToWorldPoint(playerPointInViewport);
            //プレーヤーのビューポート座標をワールド座標に変換して代入
            //if (Input.GetAxis("Mouse X") < 0)//もしマウスが左に移動したとき
            //{
            //    transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, slope), goRotationSmooth * -Input.GetAxis("Mouse X") * Time.deltaTime);
            //    //カメラの角度(基準)とslopeを滑らかに合成してプレイヤーの角度に代入する(Time.deltaTimeを掛けているのは環境の違いによる回転の差をなくすため)
            //}
            //if (Input.GetAxis("Mouse X") > 0)//もしマウスが右に移動したとき
            //{
            //    transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, -slope), goRotationSmooth * Input.GetAxis("Mouse X") * Time.deltaTime);
            //    //上と同じ
            //}
        }
        //if (!Input.GetMouseButton(0) || Input.GetMouseButton(0) && Input.GetAxis("Mouse X") == 0)//もしマウスが押されていない or マウスが押されている + マウスが移動していないとき
        //{
        //    transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, 0), outRotationSmooth * Time.deltaTime);
        //    //元の角度に戻す
        //}
        mouseMovement = new Vector3(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"), 0) * Time.deltaTime * mouseSensitivity;
        //マウスの移動量(Time.deltaTimeを掛けているのは環境の違いによる移動量の差をなくすため)
        playerPointInViewport = Camera.main.WorldToViewportPoint(transform.position) + mouseMovement;
        //プレイヤーの場所とマウスの移動量を足す
        playerPointInViewport.z = distanceToCamera;
        //プレイヤーとカメラの距離(ビューポート座標に直接代入しても変換したときに自動的に距離にしてくれる(便利))
        Clamp();//移動制限
    }

    /// <summary>
    /// 自機移動(android実機)
    /// </summary>
    void OnTouchDrag() {
        if (Input.touchCount > 0)//もしタッチされたとき
        {
            touch = Input.GetTouch(0);//タッチのデータを代入
            touchMovementX = touch.deltaPosition.x / mouseSensitivity * Time.deltaTime;
            touchMovementY = touch.deltaPosition.y / mouseSensitivity * Time.deltaTime;
            transform.position = Camera.main.ViewportToWorldPoint(playerPointInViewport);
            //プレーヤーのビューポート座標をワールド座標に変換して代入
            //if (touchMovementX < 0)//もしタッチの場所が左に移動したとき
            //{
            //    transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, slope), goRotationSmooth * -touchMovementX);
            //    //カメラの角度(基準)とslopeを滑らかに合成してプレイヤーの角度に代入する
            //}
            //if (touchMovementX > 0)//もしタッチの場所が右に移動したとき
            //{
            //    transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, -slope), goRotationSmooth * touchMovementX);
            //    //上と同じ
            //}
        }
        //if (Input.touchCount == 0 || Input.touchCount > 0 && touchMovementX == 0)//もしタッチされていない or タッチされている + タッチ場所が移動していないとき
        //{
        //    transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, 0), outRotationSmooth * Time.deltaTime);
        //    //元の角度に戻す
        //}
        mouseMovement = new Vector3(touchMovementX, touchMovementY);
        //タッチの移動量
        playerPointInViewport = Camera.main.WorldToViewportPoint(transform.position) + mouseMovement;
        //プレイヤーの場所とタッチの移動量を足す
        playerPointInViewport.z = distanceToCamera;
        //プレイヤーとカメラの距離(ビューポート座標に直接代入しても変換したときに自動的に距離にしてくれる(便利))
        Clamp();//移動制限
    }

    void Clamp() {
        playerPointInViewport.x = Mathf.Clamp(playerPointInViewport.x, 0, 1);
        playerPointInViewport.y = Mathf.Clamp(playerPointInViewport.y, 0, 1);
        //プレーヤーのビューポート座標を制限する
    }
}

ソースコードには今回とは関係ないっぽい部分もたくさんありますが、どこが関係しているのか私では断定できないので、この.csはそのまま載せます

試したこと

Strt()の中のpositionを決定する一文を消したところ、最初は自機が表示されましたが、タッチすると自機がどっかに消えました。。
また、すべてのWorldToViewportPoint→ViewportToWorldPointに変更したら、自機が表示されてタッチした際に時機が動くようにはなったのですが、以前のようにスライド量に応じたぶん移動、ではなく、ほとんど少ししか移動しないようになってしまいました
おそらくカメラがビューポート座標ではなくワールド座標しかみなくなったから?が原因だと思いますが、設定がわからないです。。

何か原因として考えられるとこ、ほかに必要な情報等あればなんでもいいので教えてもらえると助かります><

追記

オブジェクトのZ軸の座標が5or10になったらカメラに写って移動するようになりましたが、、
以前と違って移動がスムーズではなく、スライドしたぶん移動しなくなりました
考えられる原因としてはどのへんでしょうか?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14184908134?__ysp=dW5pdHkgT25Nb3VzZURyYWcgQ2xhbXAg55%2Bl5oG16KKL
こちらが参考にしたリンクです

また、オブジェクト上のmouseSensitivityやdistanceToCameraの値を色々変えるとタッチ・スライドした際の移動速度が全然変わるので、そこの設定値をちょうどよく変えればいいのだと思いますが、
この値はどうすればちょうどよくなるのでしょうか?。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る