個人的勉強メモ置き場

プログラミングど素人のメモ置き場

オブジェクトを滑らかに追随させる

指で画面をスライドしたら追随するようにしたい



こんな感じ
f:id:zykb:20200429004413g:plain

とりあえず考えてみる

タップ中の処理だからUpdate関数内でInput.GetMouseButton(0)がtrueのときに処理させれば良さそう。

毎フレームごとにVector3.Lerp( )で線形補完すればいい感じ()で滑らかになるのでは??ということでコード

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

public class BallMove : MonoBehaviour
{
    Vector3 startPos;
    Vector3 endPos;
    Vector3 tapPos;
    public float speed;

    void Update()
    {
        if(Input.GetMouseButton(0))
        {
            startPos = transform.position;
            tapPos = Input.mousePosition;
            tapPos.z = 10.0f;

            // スクリーン座標からワールド座標に変換
            endPos = Camera.main.ScreenToWorldPoint(tapPos);
                   
            // 線形補完的に移動させる
            transform.position = Vector3.Lerp(startPos, endPos, speed * Time.deltaTime);
        }
    }
}


とすると上のgifのような動きになった。(speedは良い感じに調整してください)

startPosにそのフレーム時点でのオブジェクトの位置、endPosをスマホでタップした位置としてその間をVector3.Lerp( )で移動させた感じ。Input.mousePositionでタップした位置を受け取れるがこれはスクリーン座標なのでScreenToWorldPointでワールド座標に変換してから使おう

せっかくなのでこれをボール転がしに使ってみる

f:id:zykb:20200429014231g:plain
移動制限を追加してみた


移動制限を追加したコード

if(Input.GetMouseButton(0))
        {
            startPos = transform.position;
            tapPos = Input.mousePosition;
            tapPos.z = 10.0f;

            // スクリーン座標からワールド座標に変換
            endPos = Camera.main.ScreenToWorldPoint(tapPos);

            // 移動制限
            endPos.x = Mathf.Clamp(endPos.x, -4.5f, 4.5f);
            endPos.y = 1;

            // 線形補完的に移動させる
            transform.position = Vector3.Lerp(startPos, endPos, speed * Time.deltaTime);
        }


Mathf.Clamp( )

範囲内に収めたい値 = Mathf.Clamp(範囲内に指定したい値,最小値,最大値);

的な感じで使う(多分)

今回はボールがステージから飛び出さないようX座標を-4.5~+4.5に収めるために使った。シンプルな避けゲーに使えそう