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

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

ただいまの
回答率

90.50%

  • Android

    7099questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Unity2D

    1150questions

ステージ端でキャラクターの移動がカクカクしてしまう

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 103

Wings-12

score 7

お世話になります。

現在タッチスクリーンをタップしたらキャラクターがそのタッチした場所に移動するスマホゲームを作っています。
以下の処理を処理を作りたいのですが、問題が起きており困っています。

作りたい処理:エリア(ステージ)端へキャラクター(以下Player1と記述)を移動しても
Player1がカクカクせずにスムーズに移動できるようにすること。

問題:エリア端にキャラクターを移動したときに
Player1がカクカク(エリア端で引っかかったような挙動)をすることです。

参照gif:
イメージ説明

作成したスクリプト:

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

/// <summary>
/// Player1を操作するクラス
/// 主に移動処理を書いている。
/// </summary>
public class Player1Controller : MonoBehaviour
{
    // Player1のバトル開始座標
    const float player1_startPositionX = -410.0f;
    const float player1_startPositionY = -92.0f;

    // タッチパネルをタップした位置を取得する変数
    Touch touch;
    Vector3 touchPosition;

    // Player1を約1マス分前へ表示
    Vector3 oneSquareForward = new Vector3(60.0f, 0.0f);

    // Use this for initialization
    void Start()
    {
        // このtransform自身のlocalPositionを初期化
        this.transform.localPosition = new Vector3(
            player1_startPositionX,
            player1_startPositionY,
            0.0f
            );
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.touchCount > 0)
        {
            // タッチパネルをタップした位置を取得
            touch = Input.GetTouch(0);

            touchPosition = Camera.main.ScreenToWorldPoint(touch.position);

            touchPosition.z = 0.0f;

            // Player1が青エリア内のみ移動
            if (touchPosition.y < BattleArea.myUpperSide &&
                BattleArea.myLowerSide < touchPosition.y &&
                touchPosition.x + oneSquareForward.x < BattleArea.myRightSide &&
                BattleArea.myLeftSide < touchPosition.x + oneSquareForward.x)
            {
                this.transform.position =
                    touchPosition + oneSquareForward;
            }
        }
    }
}

それほど重い処理ではないと思いますし、なぜエリア端でカクカクした動きになってしまうかが分かりません。
どうかアドバイスをお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

このコードだと、if文を満たさない場合(つまりタッチ位置がエリア外の場合)、
transform.positionは変更されないのでその間は移動しないことになります。
その後タッチ位置がエリア内に戻ったタイミングで「その時のタッチ位置」を元に再度移動するので、カクカクする(ワープする)ように見えるんだと思います。

if文にelseを付け足して、適切な移動をするようにコードを加えれば動くと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/15 06:35

    ありがとうございました。
    アドバイスに従い、以下のコードを書いたら解決しました。

    ```lang-C#
    // 青エリア外側右上の移動処理
    else if (BattleArea.myRightSide - oneSquareForward.x <= touchPosition.x &&
    BattleArea.myUpperSide <= touchPosition.y)
    {
    player1Position.x = BattleArea.myRightSide;
    player1Position.y = BattleArea.myUpperSide;

    this.transform.position = player1Position;
    }
    // 青エリア外側左上の移動処理
    else if (touchPosition.x <= BattleArea.myLeftSide - oneSquareForward.x &&
    BattleArea.myUpperSide <= touchPosition.y)
    {
    player1Position.x = BattleArea.myLeftSide;
    player1Position.y = BattleArea.myUpperSide;

    this.transform.position = player1Position;
    }
    // 上記以外の青エリア外側上の処理
    else if (BattleArea.myUpperSide < touchPosition.y)
    {
    player1Position.x = touchPosition.x + oneSquareForward.x;
    player1Position.y = BattleArea.myUpperSide;

    this.transform.position = player1Position;
    }
    // 青エリア外側下の処理
    else if (touchPosition.y <= BattleArea.myLowerSide)
    {
    player1Position.x = touchPosition.x + oneSquareForward.x;
    player1Position.y = BattleArea.myLowerSide;

    this.transform.position = player1Position;
    }
    // 青エリア外右側の処理
    else if (BattleArea.myRightSide - oneSquareForward.x <= touchPosition.x)
    {
    player1Position.x = BattleArea.myRightSide;
    player1Position.y = touchPosition.y;

    this.transform.position = player1Position;
    }
    // 青エリア外左側の処理
    else if (touchPosition.x <= BattleArea.myLeftSide - oneSquareForward.x)
    {
    player1Position.x = BattleArea.myLeftSide;
    player1Position.y = touchPosition.y;

    this.transform.position = player1Position;
    }
    ```

    キャンセル

  • 2019/03/15 13:49

    今更気付きましたが

    player1Position = touchPosition + oneSquareForward;
    player1Position.x = Mathf.Clamp(player1Position.x, BattleArea.myLeftSide, BattleArea.myRightSide);
    player1Position.y = Mathf.Clamp(player1Position.y, BattleArea.myLowerSide, BattleArea.myUpperSide);
    this.transform.position = player1Position;

    にするとif文すら要らなくなるんじゃないかと思います。
    (Mathf.Clamp(A, B, C) は「AがBより小さかったらB, Cより大きかったらC, どちらでもなければAのまま」の数値を返すメソッドです)

    キャンセル

  • 2019/03/15 20:59

    感謝申し上げます。
    書いて頂いたソースコードを私が書いた上記のソースコードの代わりに書いたら、
    期待通り動作しました。

    sakura_hanaさんは本当にすごいです。前回に引き続き本当にありがとうございました。
    私もsakura_hanaさんみたいにUnityが使えるように精進します。

    キャンセル

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

  • Android

    7099questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Unity2D

    1150questions