説明

//Mathf.Clampは値を制限内に収める関数である
Mathf.Clamp(対象の値, 最小値, 最大値);
最小値を返す例
int 対象の値 = 3;
int 最小値 = 10;
int 最大値 = 20;

//対象の値(3)が最小値(10)より低いため("3"〜10〜20)
//最小値(10)を返す
int 結果(10) = Mathf.Clamp(対象の値, 最小値, 最大値);
最大値を返す例
int 対象の値 = 50;
int 最小値 = 10;
int 最大値 = 20;

//対象の値(50)が最大値(20)より大きいため(10〜20〜"50")
//最大値(20)を返す
int 結果(20) = Mathf.Clamp(対象の値, 最小値, 最大値);
何もしない場合
int 対象の値 = 16;
int 最小値 = 10;
int 最大値 = 20;

//対象の値(16)は最小値と最大値の間にあるので(10〜"16"〜20)
//そのまま16を返す
int 結果(16) = Mathf.Clamp(対象の値, 最小値, 最大値);

この関数を使えば移動する対象に、制限を設けることができる
public bool IsRange(float Target, float Min, float Max)
    {
        float Result = Mathf.Clamp(Target, Min, Max);

        if (Result == Target) return true;
        return false;
    }

ベクトル別に用意することで、三次元の移動制限も可能
public void RestrictedMove(Vector3 Position, Vector3 Vec3Min, Vector3 Vec3Max, Space Type)
    {
        //座標と移動を加算した値
        Vector3 Result = transform.localPosition + Position;

        if (IsRange(Result.x, Vec3Min.x, Vec3Max.x) == true)
        { 
            transform.Translate(Position.x, 0, 0, Type);
        }

        if (IsRange(Result.y, Vec3Min.y, Vec3Max.y) == true)
        {
            transform.Translate(0, Position.y, 0, Type);
        }

        if (IsRange(Result.z, Vec3Min.z, Vec3Max.z) == true)
        {
            transform.Translate(0, 0, Position.z, Type);
        }
    }

自分用テンプレート

using UnityEngine;
using System.Collections;

public class RangeLimiterTranslate : MonoBehaviour {

    //物理挙動付きの座標移動
    //対象にRigidbodyが無いと機能しない
    public void RestrictedMoveRigidbody(Vector3 Position, Vector3 Vec3Min, Vector3 Vec3Max, Space Type)
    {
        Vector3 Result = Restricted(Position, Vec3Min, Vec3Max, Type);

        GetComponent<Rigidbody>().MovePosition(transform.position + Result);
    }

    //Transformによる移動
    public void RestrictedMove(Vector3 Position, Vector3 Vec3Min, Vector3 Vec3Max, Space Type)
    {
        Vector3 Result = Restricted(Position, Vec3Min, Vec3Max, Type);

        transform.Translate(Result, Type);
    }

    //移動結果を制限内に調整する
    public Vector3 Restricted(Vector3 Position, Vector3 Vec3Min, Vector3 Vec3Max, Space Type)
    {
        //最終的に移動できる座標
        Vector3 Result = Vector3.zero;

        //座標と移動を加算した値
        Vector3 MovePosition = transform.localPosition + Position;

        //XYZ軸の判定
        if (IsRange(MovePosition.x, Vec3Min.x, Vec3Max.x) == true)
        {
            Result.x += Position.x;
        }

        if (IsRange(MovePosition.y, Vec3Min.y, Vec3Max.y) == true)
        {
            Result.y += Position.y;
        }

        if (IsRange(MovePosition.z, Vec3Min.z, Vec3Max.z) == true)
        {
            Result.z += Position.z;
        }

        return Result;
    }

    //範囲内に存在するかの判定式
    public bool IsRange(float Target, float Min, float Max)
    {
        //「Max <= Result」ならMaxの値を入れる
        //「Result <= Min」ならMinの値を入れる
        //「Min <= Result <= Max」なら何もしない
        float Result = Mathf.Clamp(Target, Min, Max);

        //調整が入らなければ、範囲内なのでtrue
        if (Result == Target) return true;
        //制限された場合false
        return false;
    }
}

© 僕の説明書おきばwiki All Rights Reserved.

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー

Grand Theft Auto V 更新停止

Unity5 更新停止

フリーエリア

© 僕の説明書おきばwiki All Rights Reserved.
当サイトの御利用につきまして
いかなるトラブルや
損失・損害等に一切責任を
問わないものとします。

Wiki内検索

管理人/副管理人のみ編集できます