FC2ブログ
04 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 06

ハルシオンシステムの気ままBlog

株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

 

【ハルシオンブログ】ScriptableObjectを使う時の注意点。そのまま使うとマスタの値が変わっちゃうよ? 

今日は素敵な天気ですね!こんな日は散歩がしたくなります!
まぁ しませんけど。坂内です。

以前ScriptableObjectの作成方法や、使い方を紹介しました。
【ハルシオンブログ】UnityでScriptableObjectを作成して、使う方法の紹介。なんか使いやすいように使ってください! 】

マスタデータ的な感じで使うことが多いかと思いますが、使う上で気を付けないといけない点があるので、紹介。

こんなデータを作成します。
【Enemy.cs】
public class Enemy : ScriptableObject
{
public List enemys = new List();

[System.Serializable]
public class EnemyData {
public string name;
public int maxHp;
public int hp;
public int atk;
public Sprite image;
}
}




これで、敵のデータ作成完了。

次に画面にボタンを置き、クリックすることで、敵に攻撃をする感じのを作ります。



【Script20190415.cs】
using UnityEngine;
using UnityEngine.UI;

public class Script20190415 : MonoBehaviour
{
[SerializeField]
Enemy enemyMst;
Enemy.EnemyData currentEnemy;

// UI
public Text lblEnemyName;
public Text lblEnemyHP;
public Image imgEnemy;

private void Start() {
MakeNewEnemy();
}

public void OnClickAttack() {
// 攻撃ダメージ(10~30)
int atkDmg = Random.Range(10,31);
currentEnemy.hp -= atkDmg;
if (currentEnemy.hp <= 0) {
MakeNewEnemy();
return;
}
lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
}

private void MakeNewEnemy()
{
// 敵のデータをランダムで1体作成
currentEnemy = enemyMst.enemys[Random.Range(0, enemyMst.enemys.Count)];
lblEnemyName.text = currentEnemy.name;
lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
imgEnemy.sprite = currentEnemy.image;

}
}


ボタンをクリックしたときにOnClickAttackを呼ぶようにします。

そうすると・・・・




えっ!

なんかおかしい・・・・
調べてみると、こうなっているのが分かります。



えー!マスタの値がかわってるうううううう!!!

これじゃマスタとしての意味なくなってしまいます。

これ、値渡しじゃなくて参照渡しだから起きちゃうんですよね。

なので、ScriptableObjectのオブジェクトを使う場合にはディープコピーにて使ってあげるといいと思います。

なんかいい方法あるのかもしれませんが、今のところこんな感じでやってます。

【Enemy.cs】
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "EnemyData", menuName = "ScriptableObjects/MakeEnemyData")]
public class Enemy : ScriptableObject
{
public List<EnemyData> enemys = new List<EnemyData>();

[System.Serializable]
public class EnemyData {
public string name;
public int maxHp;
public int hp;
public int atk;
public Sprite image;
public void Copy(EnemyData enemyData)
{
this.name = enemyData.name;
this.maxHp = enemyData.maxHp;
this.hp = enemyData.hp;
this.atk = enemyData.atk;
this.image = enemyData.image;
}
}
}


コピーメソッドを付けてあげます。

次にScript20190415.csのMakeNewEnemyメソッドを次のように変えます

Private void MakeNewEnemy()
{
// 敵のデータをランダムで1体作成
currentEnemy = new Enemy.EnemyData();
currentEnemy.Copy(enemyMst.enemys[Random.Range(0, enemyMst.enemys.Count)]);

lblEnemyName.text = currentEnemy.name;
lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
imgEnemy.sprite = currentEnemy.image;
}



こんな感じでやれば、ちゃんと動くようになります。



気を付けないと、マスタデータが書き換わってしまいます。

という感じで、今日はScriptableObjectを使う上での注意点でした。

あでゅ~ノシ
スポンサーサイト

Category: 開発日記(Unity)

Tag: Unity  ゲーム  ゲーム開発  C#  ScriptableObject 
tb 0 : cm 4   

【ハルシオンブログ】タイルマップを使ってみた。意外と簡単にできるんすね。 

こんにちは!坂内っす。
もう次の日曜日にはデジゲー2018っすね!
ブースの皆さん頑張って準備してくださいな!

さてさて、本日のUnityのお話はタイルマップについて。
Unity2017.2くらい?から導入されたタイルマップなんですが、今まで触ってもなかったので、ここで触ってみようかなと。

タイルマップとは?
タイル(英: tile)は、建設資材の一つで、壁や床の保護、あるいは装飾用に多数張りつける板状のもの。

地図、マップ

ってことで、ゲームの画面をタイルで並べるように作る機能のようです。

さてさて、アセットストアにもいろいろとタイルマップで使えるマップチップのアセットがあるようです。
今回はこれを使ってみました。



まずはタイルパレットを作成します。
あ、ちなみに使用しているUnityは2018.2.1です。バージョンによって多少コマンドの位置が変わるかも?



Tile Paletteを選択するとウインドウが出てきます。

出てきたウインドウの「Create New Palette」を押して、Nameにパレット名を入力し、「Create」を選択。


そうすると、今付けた名前のパレットプレハブができます。


次に使用するテクスチャを選択し、設定します。

今回はこれを使ってみましょう。


Bricksってファイルです。

Sprite Modeを「Multiple」に変更します。
Pixel Per Unitの数値をタイルのサイズにします。
チップが16x16だった場合は16を入力します。(今回は32x32だったので、32を入力)


そして「Sprite Editor」ボタンを押す!

SpriteEditorの画面で「Slice」ボタンを押し、出てきたウインドウでTypeを「Grid By Size」へ変更。
PixelSizeを32,32に設定し「Slice」ボタンを押す。




テクスチャが32x32で白い線で切られると思います。

これでウインドウの右上にあるxを押してApply。

これで、テクスチャの準備は完了です。

次に、今のBrickファイルをTilePaletteウインドウにドラッグ&ドロップします。



これで完成です。

次にタイルマップを画面に置いてみましょう。

「GameObject」⇒「2D Object」⇒「Tilemap」を選択します。


そうすると、Hierarchyに「Grid」というオブジェクトが作成されます。
このGridを選択すると、Sceneウインドウに白い線が出るようになります。


この状態で、TilePaletteで好きなチップを選択、クリックやドラッグでタイルを配置できます。



Shift+ドラッグ(クリック)で削除できます。

また、"「"ボタン、"」"ボタンを押すことでタイルを回転できます。

さて、このままだとこうなっちゃいます。



そうです。コライダーが付いていないのですり抜けちゃう!

コライダーの付け方は簡単です。

Hierarchyにある「Tilemap」に「TilemapCollider2D」を付けます。



これでキャラがちゃんとぶつかるようになります。

こんな感じ。


簡単にTilemapって使えるんですね!
今度何かにつかってみよう!

ということで、今日はこれであでゅ~ノシ

Category: 開発日記(Unity)

Thread: プログラミング

Janre: コンピュータ

Tag: Unity  ゲーム  2Dゲーム  Sprite  ゲーム開発  タイルマップ 
tb 0 : cm 0   

【Unity】Unity&Orthelloによる2Dゲーム作成⑦ 

はい、こんにちわ坂内でっす。

Unity難しいでっす。
土曜出社してAndroidゲーム【モンスラ】バージョンアップしたでっす。

今回の目玉は必殺技の追加、クリティカルヒット追加、フェアリー追加でしたが、実は軽くなってるんです!

Drawcallが劇的に減ってるんですよ!

Ver1.1まではフルメンバー(村人200人+ユニット199人x6クラス)の場合、Drawcallが200ほど。
重いです!これ重いんですよ!

Ver1.1までは各クラスごとにAtlasを用意し、合計7Atlasを使用していました。
Ver2では少しでも軽くしようと、GUIまわりのAtlasを一つにしたり、ユニットのAtlasをつにまとめたりしたところ、なんとDrawCall30!!!

この劇的変化!! DrawCall 200 ⇒ 30!!

ただし、スマホだとさすがにSpriteの多さが問題か、重いんです!
DrawCallの問題だけじゃあぁないっすね!!
今後軽くする方法を検討してみますが、ちょっとこれ以上はきついかな?
タップ時の攻撃エフェクトを他のAtlasと1つにしてみようという案は考えてますが・・
あと、Unity4.3によって2Dゲームまわりにどのような変化がくるか楽しみですね!!

と、いうことで今後もモンスラよろしくお願いします!

Category: 開発日記(Unity)

Tag: Android  ゲーム  2Dゲーム  Sprite  Unity 
tb 0 : cm 0   

【Unity】Unity&Orthelloによる2Dゲーム作成⑤ 

はいはーい 月曜の坂内っす。

ちょっとしたOrthelloを使用した時のコツを。

普通のオブジェクトの場合、iTweenを使用することで簡単に透明度を変更できます。
透明度を1⇒0⇒1と繰り返すことで、オブジェクトの点滅を実装することができます。

cubeというオブジェクトを作成し、マテリアルを張ります。
透過が可能なShaderを指定します。
そして、以下のコード書くことでcubeオブジェクトの点滅が可能になります。
void Start(){
GameObject cube = GameObject.Find("cube");
iTween.ColorTo(cube,iTween.Hash("a",0,"looptype","pingpong","time",2f));
}

上記コードの説明をしますと、「cubeオブジェクトの色要素 a (アルファは透過度)を2秒かけて0にする。
0になったら今度は2秒かけて1にする(pingpongによって動作を繰り返す)」となります。

これで簡単に点滅が可能です。

しかし!BUT!!!
OrthelloSpriteは上記と同じことを行うとエラーがでてしまいます。
Material doesn't have a color property '_Color'
UnityEngine.Material:GetColor(String)
iTween:GenerateColorToTargets() (at Assets/iTween/Plugins/iTween.cs:3338)
iTween:GenerateTargets() (at Assets/iTween/Plugins/iTween.cs:3144)
iTween:TweenStart() (at Assets/iTween/Plugins/iTween.cs:4603)
c__Iterator7:MoveNext() (at Assets/iTween/Plugins/iTween.cs:6567)

ナゼカ?

エラーをみると、Colorプロパティが無いといわれます。
そう、OrthelloSpriteではShaderが「mobile/Particles/Alpha Blended」になるため、Colorプロパティが存在しないからです。

しかし、よく見るとOTSpriteの中に「Alpha」というプロパティが存在します。


これを0⇒1⇒0とすることで、点滅を実装することが可能です。

では、どのようにこれをいじるのか?

iTweenのメソッドには「ValueTo」というものが用意されています。
これは、値をaからbにするというもので、使い方は以下のように使います(たぶん)。
void Start(){
GameObject cube = GameObject.Find("cube");
iTween.ValueTo(gameObject,iTween.Hash("from",0,"to",1,
         "time",2f,"onupdate","ValueChange"));
}

void ValueChange(float value){
print (value);
}
0から1まで2秒かけて変わる。


となります。
これを踏まえて、以下のようにコードを書けば・・・・
using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class Test : MonoBehaviour {

OTSprite cubeSprite;

void Start(){
cubeSprite = GameObject.Find("cube").GetComponent();
iTween.ValueTo(gameObject,iTween.Hash("from",0,"to",1,"time",2f,
"looptype","pingpong","onupdate","ValueChange"));
}

void ValueChange(float value){
cubeSprite.alpha = value;
}
}

こんな感じで、OrthelloのSpriteを点滅することができます。

以上!なにかのお役に立てたらこれ幸い。

Category: 開発日記(Unity)

Thread: 日記

Janre: 日記

Tag: Android  Unity  Orthello  ゲーム  Sprite  iTween 
tb 0 : cm 0   

今までとはちょっと違いファンタジー風ゲーム作成はじめました  その弐 

月曜の坂内っす。

先週月曜に話をしていたファンタジーっぽいゲームなんですが、21日リリースします!いや、したいです!
なんとなーく できてきました。
これちょっと面白いんじゃないかなーというか、面白いです!
写真はリリースまでおあずけです!

①簡単操作
②仲間を増やす
③敵を倒してお金を稼ぐ
④装備アイテムも盛りだくさん!(アイテムは全部で50種以上!?)
⑤アチーブは全100個!!!!!!!

どっすか?興味でません?

あれ?開発者ブログじゃない?って声聞こえそうなので1つ。

Unityゲームを開発している時、画面に表示する文字列は専ら「3DText」を使用しています。
この話以前しましたっけ?ただ問題がありまして、3DTextを多量に使うと文字が欠けてしまったり、
上手く表示できなくなってしまいます。
原因はわかりません!
そのため、固定の文字列等は画像にして張り付けたりしてます。

なにか解決方法わかる方ご教授くださいませ!

以上!

Category: その他日記

Tag: Android  Unity  ゲーム  2Dゲーム  ファンタジー 
tb 0 : cm 0