##解決したいこと
本を参考にUnityでタップゲームの作成を行っています。
クリッカー系の挙動をさせようと思い、アセットのDoTweenを用いて特定のオブジェクトをタップすると
カーブ軌道を描き上方へ飛ばしたらスコアが加算されるように実装しました。
ですが、ImagePositionに該当する画像をタップすると
オーブは生成されるものの画面の上方へ移動が行われずにスコアも加算されず困っております。
DoTweenが動かない理由に関して
もしご存知でしたらご回答お願い致します。
##GameManagar.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class GameManager : MonoBehaviour { //定数定義 private const int MAX_ORB = 10; //オーブ最大数 private const int RESPAWN_TIME = 5; //オーブが発生する秒数 private const int MAX_LEVEL = 2; //最大レベル // データセーブ用キー private const string KEY_SCORE = "SCORE"; // スコア private const string KEY_LEVEL = "LEVEL"; // レベル private const string KEY_ORB = "ORB"; // オーブ数 private const string KEY_TIME = "TIME"; // 時間 //オブジェクト参照 public GameObject orbPrefab; //オーブのプレハブ指定 public GameObject lvupPrefab; //レベルアップ時のエフェクト public GameObject canvasGame; //ゲームキャンバス public GameObject textScore; //スコアテキスト public GameObject lvupImage; //レベルアップイラスト public GameObject clearEffectPrefab; //ゲームをクリアした際のエフェクト public GameObject ImagePosition; //クリッカー用のオブジェクト public AudioClip getScoreSE; // SEタップ時 public AudioClip levelUpSE; // レベルアップ時 public AudioClip clearSE; // 効果音クリア //メンバ変数 private int score = 0; //現在のスコア private int nextScore = 10; //レベルアップまでに必要なスコア private int currentOrb = 0; //現在のオーブ数 private int levelRank = 0; //レベルランク private DateTime lastDateTime; //前回のオーブを生成した時間 private int [] nextScoreTable = new int[] {10, 100, 1000} ; //レベルアップ数 private AudioSource audioSource; //オーディオソース // Start is called before the first frame update void Start() { //オーディオソース取得 audioSource = this.gameObject.GetComponent<AudioSource> (); // 初期設定 score = PlayerPrefs.GetInt (KEY_SCORE, 0); levelRank = PlayerPrefs.GetInt (KEY_LEVEL, 0); nextScore = nextScoreTable [levelRank]; lvupImage.GetComponent<ObjectManager> ().SetLvupPicture (levelRank); RefreshScoreText (); } // Update is called once per frame void Update() { } //新しいオーブの生成 public void CreateNewOrb () { lastDateTime = DateTime.UtcNow; if (currentOrb >= MAX_ORB) { return; } CreateOrb (); currentOrb++; } //オーブ生成 public void CreateOrb () { GameObject orb = (GameObject)Instantiate (orbPrefab); orb.transform.SetParent (canvasGame.transform, false); orb.transform.localPosition = new Vector3 ( UnityEngine.Random.Range (-100.0f, 100.0f), UnityEngine.Random.Range (-300.0f, -450.0f), 0f); //オーブの種類を設定 int kind = UnityEngine.Random.Range(0, levelRank + 1); switch (kind) { case 0: orb.GetComponent<OrbManager> ().SetKind (OrbManager.ORB_KIND.BLUE); break; case 1: orb.GetComponent<OrbManager> ().SetKind (OrbManager.ORB_KIND.GREEN); break; case 2: orb.GetComponent<OrbManager> ().SetKind (OrbManager.ORB_KIND.PURPLE); break; } orb.GetComponent<OrbManager> ().FlyOrb (); audioSource.PlayOneShot (getScoreSE); //アニメ再生 AnimatorStateInfo stateInfo = ImagePosition.GetComponent<Animator> ().GetCurrentAnimatorStateInfo (0); if (stateInfo.fullPathHash == Animator.StringToHash ("Base Layer.get@tapobject")) { //すでに再生中なら先頭から ImagePosition.GetComponent<Animator> ().Play (stateInfo.fullPathHash, 0, 0.0f); } else { ImagePosition.GetComponent<Animator> ().SetTrigger ("isGetScore"); } } //オーブ入手 public void GetOrb (int getScore) { if (score < nextScore) { score += getScore; // レベルアップ値を越えないよう制限 if (score > nextScore) { score = nextScore; } LevelUp (); RefreshScoreText (); //ゲームクリア判定 if ((score == nextScore) && (levelRank == MAX_LEVEL)) { LevelMax (); } } currentOrb--; } //スコアテキスト更新 void RefreshScoreText () { textScore.GetComponent<Text> ().text = "Orb: " + score + " / " + nextScore; } //レベルアップ管理 void LevelUp () { if (score >= nextScore) { if (levelRank < MAX_LEVEL) { levelRank++; score = 0; LevelUpEffect (); nextScore = nextScoreTable [levelRank]; lvupImage.GetComponent<ObjectManager> ().SetLvupPicture (levelRank); } } } //レベルアップ時の演出 void LevelUpEffect () { GameObject lvupEf = (GameObject)Instantiate (lvupPrefab); lvupEf.transform.SetParent(canvasGame.transform, false); lvupEf.transform.SetSiblingIndex (2); audioSource.PlayOneShot (levelUpSE); Destroy (lvupEf, 0.5f); } //レベルが限界値まで到達した時の演出 void LevelMax () { GameObject clearEf = (GameObject)Instantiate (clearEffectPrefab); clearEf.transform.SetParent (canvasGame.transform, false); audioSource.PlayOneShot (clearSE); } }
##OrbManagar.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; public class OrbManager : MonoBehaviour { //オブジェクト参照 private GameObject gameManager; //ゲームマネージャー public Sprite[] orbPicture = new Sprite [3]; //オーブの絵 public enum ORB_KIND{ //オーブの種類を定義 BLUE, GREEN, PURPLE, } private ORB_KIND orbKind; //オーブの種類 // Start is called before the first frame update void Start() { gameManager = GameObject.Find ("GameManager"); } // Update is called once per frame void Update () { } // オーブが飛ぶ public void FlyOrb () { RectTransform rect = GetComponent<RectTransform> (); // オーブの軌跡設定 Vector3[] path = { new Vector3(rect.localPosition.x * 4.0f, 1100f, 0f), new Vector3(0f, 1400f, 0f), }; // DOTweenを使ったアニメ作成 rect.DOLocalPath (path, 0.5f, PathType.CatmullRom) .SetEase (Ease.OutQuad) .OnComplete (AddOrbPoint); // 同時にサイズも変更 rect.DOScale ( new Vector3 (0.5f, 0.5f, 0f), 0.5f ); } // オーブアニメ終了後にポイント加算処理をする void AddOrbPoint () { switch (orbKind) { case ORB_KIND.BLUE: gameManager.GetComponent<GameManager> ().GetOrb (1); break; case ORB_KIND.GREEN: gameManager.GetComponent<GameManager> ().GetOrb (5); break; case ORB_KIND.PURPLE: gameManager.GetComponent<GameManager> ().GetOrb (10); break; } Destroy (this.gameObject); } //オーブの種類を設定 public void SetKind (ORB_KIND kind){ orbKind = kind; switch (orbKind) { case ORB_KIND.BLUE: GetComponent<Image> ().sprite = orbPicture [0]; break; case ORB_KIND.GREEN: GetComponent<Image> ().sprite = orbPicture [1]; break; case ORB_KIND.PURPLE: GetComponent<Image> ().sprite = orbPicture [2]; break; } } }
タップしたときに移動の関数が呼べているのでしょうか.
また,移動時に何かしらのエラーなどはでていませんか.
あなたの回答
tips
プレビュー