こんにちは、東京スタジオでアプリエンジニアをしていますN.Kと申します。
自分は業務ではCocos2d-xを使っていますが、最近の流行りであるUnityを色々触ってみてスキルアップをしようとしています。
そこで感じたことやハマったことを書こうと思います。
これからUnityをやろうと思っている自分のようなエンジニアの役に立てれば幸いです。
概要
前提としては「Cocos2d-x+CocosBuilder」で開発を行いってる若しくは、経験がある方を対象としています。
また、Cocos2d-xやCocosBuilderの環境構築、使い方などは割愛致します。
実際に、CocosBuilderやCocos2d-xを使った処理をUnity(C#)に置き換えて行きたいと思います。
実際にcocos2d-xの処理をUnityで置き換えてみる
今回は、下記2種類のコードを置き換えて行きます。
- UIオブジェクトのアサイン方法
- delegateを利用したコールバック処理
CocosBuliderでのUIのアサインをUnityに置き換える
初めにCocosBuilderでのやり方を示してから、Unityでの手順を紹介します。
CocosBuilderでの設定方法
まず、cocosBuilder側の設定は以下になるかと思います。
※この例では、ラベルとします。
// ccbiファイルからラベルを変数にアサインします。
bool AnyClass::onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode) {
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "text", Label*, m_pText);
return true;
}
使う場合は、以下のようになります。
void AnyClass::setText(const char* str) {
if (m_pText) {
m_pText->setString(str);
}
}
Unityでの設定方法
上記をUnity+C#で置き換えると以下の様になります。
まず、AnyText.csというスクリプトを作成し、アタッチします。
// AnyText.cs
using UnityEngine;
public class AnyText : MonoBehaviour
{
}
AnyText.csに下記を追加します。
[SerializeField] private Text _anyText = default;
そうすると、Unity上でTextとスクリプトのTextを紐付けられるようになります。
TextをAnyTextのNoneの所にドラッグ&ドロップします。
これでCocos2d-xの onAssignCCBMemberVariable が終わった状態です。
public class AnyText : MonoBehaviour {
[SerializeField] private Text _anyText = default;
public void SetText(string str) {
_anyText.text = str;
}
}
以上でコードからTextを扱うことが可能になります。
コールバック処理をUnity(C#)に置き換える。
標準的な方法として、delegateでの方法を置き換えていきます。
先程と同じくまずC++でのやり方を示してから、Unityでの手順を紹介します。
C++でのdelegateを用いた方法
class Delegate {
public:
virtual void OnDelegate(int value);
};
class AnyClass {
public:
void SetDelegate(Delegate* delegate) { m_delegate = delegate; }
void Execute();
private:
Delegate *m_delegate = nullptr;
}
void AnyClass::Execute() {
// 何らかの処理
if (m_delegate) {
m_delegate->OnDelegate(0);
}
}
class MainClass : public Delegate {
public:
void init();
virtual void OnDelegate(int value) override;
private:
AnyClass *m_anyClass = nullptr;
};
void MainClass::init() {
m_anyClass = new AnyClass();
m_anyClass->setDelegate(this);
m_anyClass->Execute();
}
void MainClass::OnDelegate(int value) {
// 処理
}
C#でのdelegateを用いた方法
次に、上記C++でのコードをC#に置き換えたものが以下になります。
public class AnyClass {
public delegate void OnDelegate(int value);
public OnDelegate DelegateHandler = null;
public void ExecuteDelegate() {
// 何らかの処理
DelegateHandler?.Invoke(0);
}
}
public class MainScene : MonoBehaviour {
AnyClass anyClass = default;
private void Start() {
anyClass = new AnyClass();
anyClass.DelegateHandler = OnDelegate;
anyClass.ExecuteDelegate();
}
private void OnDelegate(int value) {
// 処理
}
}
ハマった事:ファイル名とクラス名が一致していないエラー
まず、直面したのがファイルをアタッチする際の下記エラーです。
原因は、エラーメッセージに記載されている通りファイル名とクラス名が一致していない事です。
そもそも論として、ファイル名とクラス名は一致させるべきですが、C++エンジニアならウッカリやってしまうかと思います。
まとめ
Cocos2d-x+CocosBuilderで開発されている方でしたら比較的Unityは扱いやすいかと思います。
例えば今回は、紹介しませんでしたがCocosBuilderでのアニメーションの作り方もUnityにあるAnimationという機能が同じタイムライン形式の為、同じ感覚で扱うことができると思います。
また、Unityの特徴としては豊富なアセットにあると思います。
UIアニメーションを付けたいのであれば、DOTweenというアセットをインポートすれば、ccActionの様な感覚で扱えます。
このようにCocos2d-xの経験が、Unityで生きてきますので是非Unityに触れて見て下さい。