[{PageViewPlugin}]
[Minecraft Programming]
!!!Abstract
本当は、マイクラ上で作りたかったが、パラメータの表示Addonですら作れなかったので、別の方法を試してみる。例えばUnityとか。
!!!Topics
!!2D RPG by Unity
|とりあえず、Unityなら情報もたくさんありそうだし、[1]に従ってやってみよう。やりたいことは
!スキル系
*implement titles and skills
To add “Skills”:
Add SkillInventory to MenuWindow, (in inspector of Unity, we can connect script and parameters)
Add updateSkills in MainMenu.cs,
MenuRoot.cs
Add Skills to BattleWindow, I’m wondering why it is not disappeared
List<Skill> Skills to BattleParameter.cs
hey, each skill has level, and each monster and character has its own level. need modification.-> solved. divide skill object.
*韋駄天スキル
| use List.find[6]。レベルアップ時の処理OK
*skills of enemies
| OK, but, need Skill level initialization
*Skill initialization
| where is total initialization script!? -> Start() method in Player.cs should be one of them. additionally, CopyTo() in BattleParameter.cs might be the place to implement. |Previous code was to pass the just refference. I modified to pass the copied Skill objects, then initialization was successfully implemented.
* add Skill dynamically
|try to use skilllist asset which have all skills to find Skill object in the C# script, then if find the object, add the Skills List which is a member of BattleParameter しかし、Copy時には、Skillのレベルは元のままで、そのままコピーされる。ここもなんらかのCopyメソッドを作って、あたらしいオブジェクトをつくるべきか。→参照渡しじゃなくてオブジェクトを作って渡せばOKのはず。しかし、なぜか親のClassのオブジェクトが登録されてしまう。なぜだ。Skill.Clone(0)とParalysisResistance.Clone(0)でSkillクラスの方が親としたときにParalysisResistanceのオブジェクトなのに親のほうのメソッドの方が呼び出されてしまっていることがある。それは意図しない。なぜだ。
*スキルポイントによるスキル獲得
*insectorでスキルの初期レベル設定ー>SkillとSkillDataをわけることでSkillはスキルそのものの定義、SkillDataは初期レベルと一緒に設定できるデータでメンバーはSkillとInitialLevel。
!speed
*display is OK,
*next is order of attack depending on speed
*あとスピードに応じてよける(Dodge)動作も追加したい。
!main charactor
*主人公を変えたい。基礎能力値を上げる-> playerParameters.asset
*主人公の画像を変えたい→アニメーション
|Unityのアニメーション機能は強力らしいが、最初わかりにくい。
|最初Animation Windowの録音ボタンが押せる状態にならずどうしたものかという感じだったが、Animationを設定したいGameObjectをHierarchyから選ばないといけない。
|録音ボタンがおせたあと、アニメーションで使う画像の指定がなかなかできなかったが、この録音ボタンを押した後に、メインのWindowに戻って変えたい画像のInspectorで指定しているイメージを変えるとAnimation Windowで反応して変わる。この別のWindowに移動して操作するのが気持ち悪い。
|AnimationControlerもわかりにくい。ステートマシーン図みたいなやつ。ステートにあたるものを増やすには、Animationをつくって、ドラッグアンドドロップすると出てくる。矢印は、ステートに当たるものを右クリックするとMake Transitionがでてくるので、これを選ぶといつの間にか矢印がでている。この矢印をえらぶと下の方にConditionsがあり、ここにTriggerを追加する。このTriggerは、文字列で識別される。Scriptの中で定義される。わかりにくい。
!Evolution
*Speciesという種を表すクラスをつくる。でも個体はLVをもつのでSpeciesDataという、LvとSpeciesをメンバーに持つクラスも作る。かつ、進化用にEvolutionPathというクラスを複数持つようにListももつ。そのEvolutionPathは、進化先のSpeciesと条件を管理する。Copilotによるとそれがいいらしい。
*フィールド上でスペースキーを押すと出てくるコマンドに条件付きで表示されるようにする。
*上記コマンドを選ぶと進化先を選択するメニューがでてくるようにする。このとき、このコマンドを選ぶときにCallbackを指定して呼び出すのだが、Unityはこれにクセがあって、数日手間取った。エディター上で◎を押してでてくるやつから一生懸命えらぼうとしていたけど、それだとInvokeされない。動かしたいメソッドを持つのは、そのメニューアイテムがぶら下がっている、つまりアタッチされている元のGameObjectがあって、それを動かすScript上に記述しておいて、それをメニューのCallbackのところにドラッグアンドドロップで持ってきて、メソッドを指定しないといけない。
! etc..
*好きな敵を追加する。-> add asset file to EnemyData and add image file to Character Image
*出現する敵がランダムに変わるようにしたい。->元からそうだった
*add MP(Magic Point) -> Battle Windows parameters, BattleParameter.cs, BattleWindow.cs, MainMenu.cs
*add Magic
*appropriate Level up -> battleParameter.cs, playerParameter.asset
*implement eat command。麻痺耐性は、食べてゲットできるようにしたい。(未)
*implement SP(未)
*攻撃力や守備力によるダメージ計算はドラクエを参照したい。攻撃力÷2-防御力÷4を実装。ランダムによるブレや会心の補正の要素もそのうち入れる[8](途中)
* Monster level up(未)
!!その他
*Debug
|Visual Studioがいいかも。Unity Hub経由でインストール後、Unity側のExternal Toolsの設定でVisual Studioを設定しましょう[5]。そうすると、Scriptを開くだけで、プロジェクトを読み込んでくれて、再生ボタンを押すとUnityにアタッチするので、その状態でUnityで動作を始めるとデバッガーが動き、マークしていたところで止まってくれます。変数の中身とかも見れます。
*AssetとScript
|AssetとScriptの関係は、途中から変更できないと理解。新しい種類のAssetを追加する場合は、まずScriptでClassを定義しておいて、そのClassに紐づいたAssetをメニューからCreateするイメージ
*プレハブ化?
|GameObjectを再利用できるようにするらしい[2].
*TileMapにMapチップを貼り付けると小さい
|それは、元の画像ファイルのPixels Per Unitの値が正しくないかららしい。Sliceする前の画像のInspectorのなかにPixels Per Unitを探して、デフォルト100になっているので、それをピクセルサイズ、32とかに直してApplyすると治ったりする。[3]
*マップをレイヤーで重ねるときの順番
|Gridのinspectorの中にSorting LayerにOrder in Layerという数字をいれるところがある。数字が大きいほど前面に出る[4]。
*[C_Sharp]
|Unityで使われているのは、C#。プログラミング言語の一つで、[Java]に似ているような気がするが、たまによくわからない表現がある。調べます。
*IEnumerator + yield returns + WaitWhile(()=>conditions)
|[7]に参考あり。何となく、IEnumeratorが繰り返され、条件が満たされる間は待ちなさい、だから条件が満たされなくなったら(**に)抜け出す、って感じか。
!!!Reference
#[#1]Unity C# 2DRPGゲームの作り方 ~ドラクエ風レトロRPGを作ろう!~, [https://feynman.co.jp/unityforest/game-create-lesson/2drpg-game/]
#[#2]2022年02月12日, ohbashunsuke, UnityのPrefab(プレハブ)とは?使い方まで徹底解説, [https://shibuya24.info/entry/unity-prefab]
#[#3]2022年05月17日, ohbashunsuke, 【2Dゲームで必須】UnityのSprite(スプライト)の単位をわかりやすく解説, [https://shibuya24.info/entry/unity-unit]
#[#4]【Unity入門】Unity2D 画像の前後を変える方法(SpriteRenderer)!1分からの簡単Unity入門, [https://frog-blend.hatenablog.com/entry/2023/10/05/155921]
#[#5]2025年1月30日, オオバ,【2025年版】Visual StudioをインストールしてUnityで使う方法, [https://shibuya24.info/entry/unity-install-visualstudio]
#[#6]【C#入門】Listの要素を検索するFindの使い方(FindAll/FindIndex), [https://www.sejuku.net/blog/45252?utm_source=blog&utm_medium=blog&utm_campaign=blog__45381]
#[#7]WaitWhile, [https://docs.unity3d.com/6000.1/Documentation/ScriptReference/WaitWhile.html]
#[#8]頭が痛くならない「ダメージ計算式」の基本の話, [https://note.com/daraneko_games/n/n9819dda2698a]