//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の説明については下記を参照。
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);
}
}