code ソーシャル

Unityアプリcodetips(44)

スポンサーリンク

//tips

//UIテキストへのplayerprefsの反映

シーン画面左上にステージクリア後に与えられる称号を記載するスペースを設け、クリアステージごとに称号を変更する。

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

using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class UItext : MonoBehaviour
{
[SerializeField] UnityEngine.UI.Text textbox;

void Start()
{
//PlayerPrefs.DeleteAll();

int clearStageNo = PlayerPrefs.GetInt("CLEAR", 0); //どのステージまでクリアしているのかをロード(セーブされていなければ「0」)

Debug.Log(clearStageNo);

if (clearStageNo ==0)
{
textbox.text = "称号:"+"お使い";
}

if (clearStageNo == 1)
{
textbox.text = "称号:" + "散歩";
}

if (clearStageNo == 2)
{
textbox.text = "称号:" + "スキップ";
}

if (clearStageNo == 3)
{
textbox.text = "称号:" + "ランニング";
}

if (clearStageNo == 4)
{
textbox.text = "称号:" + "ダッシュ";
}

if (clearStageNo == 5)
{
textbox.text = "称号:" + "転身";
}

if (clearStageNo == 6)
{
textbox.text = "称号:" + "変わり身";
}
}
}

こちらをGoalシーン用に改造すると下記のようになる。

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

using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class TitleManage : MonoBehaviour
{
[SerializeField] UnityEngine.UI.Text textbox;

void Start()
{
//PlayerPrefs.DeleteAll();

int clearStageNo = PlayerPrefs.GetInt("CLEAR", 0); //どのステージまでクリアしているのかをロード(セーブされていなければ「0」)

Debug.Log(clearStageNo);

if (clearStageNo == 0)
{
textbox.text = "お使い";
}

if (clearStageNo == 1)
{
textbox.text = "お散歩の達人";
}

if (clearStageNo == 2)
{
textbox.text = "スキップの達人";
}

if (clearStageNo == 3)
{
textbox.text = "ランニングの達人";
}

if (clearStageNo == 4)
{
textbox.text = "ダッシュの達人";
}

if (clearStageNo == 5)
{
textbox.text = "転身の達人";
}

if (clearStageNo == 6)
{
textbox.text = "変わり身の達人";
}

}
}

//ドラッグ移動後のimageを初期位置に戻す

public void OnEndDrag(PointerEventData eventData)でドラッグの終了を感知し、imageを初期位置に戻すアクションを織り込む。

今回は戻る位置をimageに付加してあるboxcolliderのbounds値を参考に強引にvector3で戻してみた。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Drag3 : MonoBehaviour, IDragHandler, IEndDragHandler
{

public void OnDrag(PointerEventData data)
{
Vector3 TargetPos = data.position;
TargetPos.z = 0;
transform.position = TargetPos;
Debug.Log("100");
}

public void OnEndDrag(PointerEventData eventData)
{
Debug.Log(3);
//Vector3 StartPos = Vector3.zero;
//Vector3 StartPos = transform.InverseTransformPoint(Vector3.zero);
Vector3 StartPos = new Vector3(2131,258,0);

transform.position = StartPos;

}

}

Boundsの説明については下記を参照。

【Unity】3D空間を定義する「Bounds」の基礎知識

https://docs.unity3d.com/ja/2018.4/ScriptReference/Collider-bounds.html

https://docs.unity3d.com/ja/2019.4/ScriptReference/Renderer-bounds.html

//ドラッグ移動量の算出

ドラッグの際の移動量はpublic void OnEndDrag(PointerEventData eventData)のeventDataの性質を使い、ワールド座標の移動量を表すeventDataをローカル座標に変換することで、ローカル座標での移動量を算出する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Drag3 : MonoBehaviour, IDragHandler, IEndDragHandler
{

public void OnDrag(PointerEventData data)
{
Vector3 TargetPos = data.position;
TargetPos.z = 0;
transform.position = TargetPos;
Debug.Log("100");
}

public void OnEndDrag(PointerEventData eventData)
{
Debug.Log(3);
//Vector3 StartPos = Vector3.zero;
//Vector3 StartPos = transform.InverseTransformPoint(Vector3.zero);
Vector3 StartPos = new Vector3(2131,258,0);

transform.position = StartPos;

Debug.Log(eventData);//ワールド座標での移動量
Vector2 tapPosition = transform.InverseTransformPoint(eventData.position);
Debug.Log(tapPosition);//ローカル座標での移動量

}

}

どうも移動量を他のオブジェクトの移動に用いるところで理解が足りていないようなので初歩的なところから確認していく。

型Transformを宣言するとき、位置だけではなく、回転なども一緒に含まれたTransformコンポーネントの中身を取り出すことを目的とする。

Vecetor3と宣言しないのは、取り出したい部位が位置だけでなく、回転、大きさも含まれることを示している。

Transformに所属するものとして、positionであるVector3が宣言されることになる。下記を見れば構造がよくわかる。

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

public class SMove : MonoBehaviour
{
// 更新用の関数
void Update()
{

// transformを取得
Transform myTransform = this.transform;

// 座標を取得
Vector3 pos = myTransform.position;
pos.x += 0.01f; // x座標へ0.01加算
pos.y += 0.01f; // y座標へ0.01加算
pos.z += 0.01f; // z座標へ0.01加算

myTransform.position = pos; // 座標を設定
}
}

ちなみに、transformを取得せず、Vector3 posのみで表そうとするとpos=posとなり初期位置から動かない問題が発生してしまう。

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

public class SMove : MonoBehaviour
{
// 更新用の関数
void Update()
{

// 座標を取得
Vector3 pos = transform.position;
pos.x += 0.01f; // x座標へ0.01加算
pos.y += 0.01f; // y座標へ0.01加算
pos.z += 0.01f; // z座標へ0.01加算

pos = pos; // 座標を設定
}
}

ここでmyTransform.positionがいきることがわかる。

また、相対的な座標移動の方法としてmyTransform.Translateを使用する方法もある。

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

public class SMove : MonoBehaviour
{
void Update()
{

// transformを取得
Transform myTransform = this.transform;

myTransform.Translate(0.01f, 0.01f, 0.01f);
}
}

人気の記事

1

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、ANAが、定額全国住み放題サービスを提供する「ADDress」と組んで、国内線を4回まで定額利用可能 ...

2

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

3

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

4

ついに、noteの月間アクティブユーザー数が4400万人(2020年3月時点)に到達しました。 そもそも、「note」とは、クリエイターが、文章やマンガ、写真、音声を投稿することができ、ユーザーはその ...

5

ボードゲームカフェが1日2回転で儲かるという記事をみつけたので興味を持ち、調べてみました。 まずは、需要がどれくらいあるのか、市場のようすからみていきましょう。 世界最大のボードゲーム市場はドイツで、 ...

-code, ソーシャル
-,

Copyright© BUSINESS HUNTER , 2023 All Rights Reserved Powered by AFFINGER5.