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

コロナによる需要変化 コロナパンデミックの影響で、人々は外に出られなくなり、自宅で過ごす時間が増えました。 この自粛ムードの中、下記のようなビジネスの需要変化が引き起こされています。 【利用者減少】 ...

2

米国レストランの決済時に毎日お世話になっていた「Square」のビジネスモデルについて本日はふれていきたいと思います。 「Square」とは、ネットにつながったモバイル端末と専用のカードリーダーを用意 ...

3

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

4

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

5

ナイキのSNKRSが、なぜこれほどまでに人気なのか?調べてみました。 きっかけは米国での友達との会話。彼は自分のシューズをみせて、「これ20万円もしたんだぜ。」と語ってくれました。 あまり靴に興味がな ...

-code, ソーシャル
-,

Copyright© BUSINESS HACKER , 2020 All Rights Reserved Powered by AFFINGER5.