code ソーシャル

Unityアプリ作成(10)

スポンサーリンク

一旦音楽はBGMのところのみ採用してアプリ制作を進めます。

アプリに機能が多くなるほどバグが増え、修正方法も複雑化して時間を食うため、初期時点の方向性と開発段取りで、いかに修正発生地点をわかりやすくし、他の箇所への影響を最小限に抑えられるプログラムを設計する大切さがわかりました。

特に開発段取りは、開発経験者ではないとわからない部分が大きいように感じます。

ちなみに、米国でスティーブ・ジョブズやレイダリオが行っていたという瞑想の団体に入り、そこで毎日10分程度座禅を組み、授けられたマントラ(真言)を無心に唱えることでフラストレーションが緩和させるという手法を学びましたが、案外役にたっています。

ストレスフルな状況下でマントラを思い出すことで、座禅を組み無心にマントラを唱える状態が脳内に呼び出され、座禅をせずともストレスがぼやけて感じられます。

儀式という印象が強いものをキーワードと一緒に人体にインプットすると、キーワードを思い出すことで、儀式の際の精神状態まで呼び出せるのは人体の神秘のように感じました。プログラミングのsave機能のところで気付きました。

また、マントラ自体が呼吸との相関があるように感じられ、授けられるマントラは深呼吸と同じ程度の息を吐かせる言葉を選んで与えられているように思えます。余談でした。

 

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 = 1;
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 smokePrefab;
public GameObject kusudamaPrefab;
public GameObject canvasGame;
public GameObject textScore;
public GameObject imageTemple;
public GameObject imageMokugyo;

private int score = 0;
private int nextScore = 10;

private int currentOrb = 0;
private int templeLevel = 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);
templeLevel = PlayerPrefs.GetInt(KEY_LEVEL,0);
currentOrb = PlayerPrefs.GetInt(KEY_ORB, 10);

for(int i = 0; i < currentOrb; i++)
{
CreateOrb();
}

string time = PlayerPrefs.GetString(KEY_TIME,"");
if (time == "")
{
lastDateTime = DateTime.UtcNow;
}
else
{
long temp = Convert.ToInt64(time);
lastDateTime = DateTime.FromBinary(temp);
}

nextScore = nextScoreTable[templeLevel];
imageTemple.GetComponent<TempleManager>().SetTemplePicture(templeLevel);
imageTemple.GetComponent<TempleManager>().SetTempleScale(score, nextScore);

RefreshScoreText();
}

// Update is called once per frame
void Update()
{
if(currentOrb < MAX_ORB)
{
TimeSpan timeSpan = DateTime.UtcNow - lastDateTime;
if(timeSpan >= TimeSpan.FromSeconds(RESPAWN_TIME))
{
while(timeSpan >= TimeSpan.FromSeconds(RESPAWN_TIME))
{
CreateNewOrb();
timeSpan -= TimeSpan.FromSeconds(RESPAWN_TIME);
}
}
}

}

public void CreateNewOrb()
{
lastDateTime = DateTime.UtcNow;
if(currentOrb >= MAX_ORB)
{
return;
}
CreateOrb();
currentOrb++;
SaveGameData();

}

public void CreateOrb()
{
GameObject orb = (GameObject)Instantiate(orbPrefab);
orb.transform.SetParent(canvasGame.transform, false);
orb.transform.localPosition = new Vector3(UnityEngine.Random.Range(-300.0f, 300.0f), UnityEngine.Random.Range(-140.0f, -500.0f));

int kind = UnityEngine.Random.Range(0, templeLevel + 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;

}

}
public void GetOrb(int getScore)
{

AnimatorStateInfo stateInfo = imageMokugyo.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0);
if (stateInfo.fullPathHash == Animator.StringToHash("Base Layer.get@ImageMokugyo"))
{
imageMokugyo.GetComponent<Animator>().Play(stateInfo.fullPathHash, 0, 0.0f);
}
else
{
imageMokugyo.GetComponent<Animator>().SetTrigger("isGetScore");
}

if (score < nextScore)
{
score += getScore;

if (score > nextScore)
{
score = nextScore;
}

TempleLevelUp();
RefreshScoreText();
imageTemple.GetComponent<TempleManager>().SetTempleScale(score, nextScore);

if ((score == nextScore) && (templeLevel == MAX_LEVEL))
{
ClearEffect();
}
}

currentOrb--;

SaveGameData();
}

void RefreshScoreText()
{
textScore.GetComponent<Text>().text = "徳:" + score + "/" + nextScore;
}

void TempleLevelUp()
{
if(score >= nextScore)
{
if(templeLevel < MAX_LEVEL)
{
templeLevel++;
score = 0;

TempleLevelUpEffect();

nextScore = nextScoreTable[templeLevel];
imageTemple.GetComponent<TempleManager>().SetTemplePicture(templeLevel);
}
}
}
void TempleLevelUpEffect()
{
GameObject smoke = (GameObject)Instantiate(smokePrefab);
smoke.transform.SetParent(canvasGame.transform, false);
smoke.transform.SetSiblingIndex(2);

Destroy(smoke, 0.5f);
}
void ClearEffect()
{
GameObject kusudama = (GameObject)Instantiate(kusudamaPrefab);
kusudama.transform.SetParent(canvasGame.transform, false);

}

void SaveGameData()
{
PlayerPrefs.SetInt(KEY_SCORE, score);
PlayerPrefs.SetInt(KEY_LEVEL, templeLevel);
PlayerPrefs.SetInt(KEY_ORB, currentOrb);
PlayerPrefs.SetString(KEY_TIME, lastDateTime.ToBinary().ToString());

PlayerPrefs.Save();

}

}

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 TouchOrb()
{
if (Input.GetMouseButton(0) == false)
{
return;
}

RectTransform rect = GetComponent<RectTransform>();

Vector3[] path =
{new Vector3(rect.localPosition.x*1.5f,300f,0f),new Vector3(0f, 150f, 0f)};

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(5);
break;
case ORB_KIND.GREEN:
gameManager.GetComponent<GameManager>().GetOrb(50);
break;
case ORB_KIND.PURPLE:
gameManager.GetComponent<GameManager>().GetOrb(500);
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;
}
}
}

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

using UnityEngine.UI;

public class TempleManager : MonoBehaviour
{
public Sprite[] templePicture = new Sprite[3];
// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{

}
public void SetTemplePicture(int level)
{
GetComponent<Image>().sprite = templePicture[level];
}
public void SetTempleScale(int score, int nextScore)
{
float scale = 0.5f + (((float)score / (float)nextScore) / 2.0f);
transform.localScale = new Vector3(scale, scale, 1.0f);
}

}

 

 

人気の記事

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.