良い記事を見つけた
課金を組み込む予定ですが、特にガチャを組み込む予定はありません。
ただ、ゲームの中で、1週間でのパラメーター上げのとき、一定の確率でパーフェクトになってほしい。
どうやって確率って、組み込むべきかと悩み中。
確率って、1%っていっても、100回ガチャ回したから1回当たる訳ではないじゃん。検索してみたら求めていた記事を見つけました。
私がやろうとしていたものとは違うのですが、すごく丁寧な説明でわかりやすい。
忘れるから、ここに書いておきます。
課金を組み込む予定ですが、特にガチャを組み込む予定はありません。
ただ、ゲームの中で、1週間でのパラメーター上げのとき、一定の確率でパーフェクトになってほしい。
どうやって確率って、組み込むべきかと悩み中。
確率って、1%っていっても、100回ガチャ回したから1回当たる訳ではないじゃん。検索してみたら求めていた記事を見つけました。
私がやろうとしていたものとは違うのですが、すごく丁寧な説明でわかりやすい。
忘れるから、ここに書いておきます。
管理していただいている親切な皆様に遠くで感謝。
世の中は能力者で溢れていますよね・・・。
【リンク】
Unityコミュニティ – Unify Community Wiki
PlayerPrefsXのページはこちら。
【リンク】
ArrayPrefs2 – http://wiki.unity3d.com/index.php/ArrayPrefs2
使い方は簡単。ソースをcsファイル化して、pluginフォルダに突っ込む。あとは、PlayerPrefsと使い方は一緒です。
特に説明なくとも使えるほどよくできているものだと思う!
情報は、溢れています。結構外国の素敵な肩がYoutubeに才能を寄付してくださっているので、参考書不要だと思った。
昔々5000円くらいのBlenderの参考書を買って一度の開いていない(しかも今回も参考にしていない)ということをしたのですが、Youtubeの方が丁寧です。英語分からなくとも、ボタンの動きで把握できるから。動画だもん。
Unity自体では苦労したところはないし、特筆することも特にないんだけど・・・。
とりあえずBlenderでもっとも苦労した、不要となったアニメーションの削除について書き残しましょう。
みんなアニメーション後から不要になることないの?後で「あーやっぱ不要だったべー」ってなったんだけどなー。不要なアニメーションがあると重くなるからどうしても消したかったのです。
こんなにただアニメーションを流すようなものは、ないからかしら。うーん。
情報がなくて大変だった。完全手探り。割と、検索自体はやっているようだけど、求める情報がない。こうすればいいよってブログがあるけど、できなかったよ。
かなり偶然だと思う。とりあえず色々ボタン押してみて、なんとかなった感じ。丸二日?くらいは潰したような気がする。
上下するアニメーション「Action01」と右に動くアニメーション「Action02」。
今回はAction01を削除してみます。
まずは、Action02を表示させてみましょう。NLAトラックで「保留アクション」に削除したいAction01があります。
それでは、NLAエディターを開きます。
現在表示しているのが、Action02。その下に、隠れているのが、保留アクションのAction01。
Action01の【保留アクション】を選択して、キーボードの「X」ボタンで削除。
保留アクションがなくなりました。ここでは。
ビューのところでも保留アクションが削除がされています。
が、しかし。これでは削除されているかのように見せかけて生きている!しつこい!
次にやるのが、ドープシートのアクションを削除。
アクションをつける、ドープシートを開きましょう。
現在開いているのは、「Action02」。ほらみて。「Action01」が「F」付きでいらっしゃる。
なので、Action01を開く。
「F」が押されているので、もう一度押して選択を解除する。すると数字が消えます。そして、「✖️」を押しましょう。
これで、やっと、Action01が削除されました。もう一度、アクション一覧を開くと、
Action01の前が「F」から「0」になっていることが確認できます。
これでやっと、消したかったアニメーションが削除されました。本当に消えたのか確認したいので、Blenderデータをセーブして、開き直してみましょう。
アクション一覧を見ると、なくなりました。
いやー。これを知るまで大変だった・・・。本当、大変だった・・・。Blender嫌いになりそうだった。
1。削除したいアクションを以外を開いておく。
2。NLAエディターで削除したアクションを削除。
3。ドープシートで削除したいアクションを開き、「F」を解除。そして「X」をおす。これで削除。
線が邪魔だからの理由で買った当時はテンキーなしにしたのですが。
バカでしたね。色々とすごい苦労すること多い。ただ壊れるところかピンピンしてるから買い換えるのも勿体無い。
なんだかんだやってきていて、BlenderもPhotoshopを入れているWindows端末でやっているから、そこまで不自由することはなかったんですけれども。
UnityはMacで対応しているからいざちょっとした修正を入れる時はすごぶる面倒臭い。
色々調べて、テンキーがない場合(ノートパソコンとか)に数字ボタンをテンキーの数字ボタンとして位置付けることができると。
これで数字ボタン押せば視点変えてもらえることになった。
結構これでつまづいたので、メモメモ。
人を作るとき、右半分を作成して、ミラーで対応する。そのとき、重なりが発生するか、微妙に離れて隙間ができることが発生した。
上のキャプチャーは重なった方。この時の対象法としては、以下の手順で対応した。
一旦、重心から離して隙間を大きく作る。
クリッピングチェックを入れてくっつける。これで綺麗にくっついてた状態のミラーができた。
微妙に離れたり、重ねたりすると肉眼ではちゃんと確認できないレベルで頂点が二つあり、UV展開の時に初めて気づいて吐き気した。
人間二人にまる二日くらい。
先日のポストの動画とサイトさんを両方参考にしながらやりました。
・・・動画の方だと、もはや一日でアニメーションまで終わらせているけどなー。
いつかああなれるのか?
UnityでC#するのと、同じくらい楽しいね。今はむしろこっちのが楽しいです。
目と口と鼻は、特にポリゴン割りせず、テクスチャーで描いているのですが。
何だろー。うーん。顔のパーツない方が可愛い気がした。
最初のテクスチャーよりは、顔がふっくらしている感じにしたから・・・顔ない方が愛嬌がありそう。ということでカオナシバージョン。
うん。カオナシがしっくりきます。
カクカクした感じを出したかったです。ここでスムーズ入れればどれくらい差があるのかとやってみました。
これが、現在のカクカクバージョン。
こちらがスムーズ追加したバージョン。うん。靴だけかな。靴だけ。ポリゴンの数が増えただけで大差ない見栄えをしているので、やっぱり荒めのままにします。
背景をフォトショとかSaiとかのドロイングツールでいきなりかけないので、Blenderで作ってしまって、Png吐き出して色ぬりすればいいやと気づいた。
そうだ。そうしよう。格段に早い。
そしてLive2DとBlenderでの人のモデリングの時間も大差ない気がした。どうしよう。
もともと女性の髪色は茶髪だったけど、せっかくなので目立たせるべく、金髪!
先日より作り始めた、5等身くらいの人型3Dモデル。
Blenderは全くの初めてだったので、いきなり人で大丈夫かと思いましたが、世の中には本当に、親切心で溢れている方が多い!
神様!BlenderもUnityも海外の人多いからYouTubeに良質な講座が山ほどある!!
この前の参考サイトさんではうまく作れなかったので(ショートカットキーがわからずついていけなかった)、探してすぐ発見したのが、こちらの方。
英語が聞き取れない!という方でも大丈夫!キーボタンは親切にも字幕で表示されています。
何より全く、難しいこと喋ってないので、「Alt」とか「ctrl」とか聞き取れれば本当に、問題ない。
この講座は20分くらいですが、私は4時間かかっています。
慣れればこの早さになるのか?
テクスチャー貼り付けしていなけど、完成。
一番、今までで一番わかりやすい講座だった。あとは女性を作って、テクスチャー貼って、動かすという工程でしょうか。
背景を描くことが苦手なので、Blenderで作って、png吐き出させて色ぬりした方が綺麗かなと思った。おそらく、作業時間的にもそこまで大差ないし、綺麗になると思う。
トゥーンシェダーをかければ、3Dっぽさも軽減できるでしょう。
Lightwaveで3Dモデリングの経験がありますが、Lightwaveよりだいぶわかりやすいというのか率直な感想。何だろう。私には使えない豪華な機能が全くないからか、求めるものができるレベルで収まっているからでしょうか。
しかしこれで無料とかBlender恐ろしい。
3Dモデルいっぱい作って公開できるといいな。
せっかくだからドラッグ処理をもっと深掘りしようと思います。
いや、ちょっとだけ触って見てこのまま使わなかったら完全に忘れるからそのまとめ。
前回やったのは、ドラッグの動きを簡単に動かすこと。
ドラッグをするとちょっと自由に動きしすぎる(求める以上に自由に動ける)ので、やはり今回のアプリでは使わない予定。・・・Y軸固定とかすればいいけど。
とりあえず、やろう。
この状態だど、ドラッグするオブジェクトを丸ごと動かす状態。
今画像で動かして「1」をそのまま残してドラッグの動きをさせたい。参考にしたのは、こちら。
・記事名:uGUIでドラッグドロップ
・サイトリンク:http://qiita.com/ayumegu/items/c07594f408363f73008c
ドラッグ先のオブジェクトを残したい、つまり、ドラッグするものを新たに作り(コピーして)それを動かす。
もしくは、ドラッグ先のオブジェクトの初期状態のコピーを作りを固定させてあげて、元のオブジェクトを動かすか。その2択かな?
私は、まずコピーを作りその子を動かすことにしました。(その方がDragEndの時破壊しやすい・・・?)
「1」のボタン(あれはボタンです)をドラッグすると、テキストオブジェクト「COPY!」が現れます。
結果物がこちら。
以下はそのソースC#です。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class DragAndDrop: MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { private Transform canvasTran; private GameObject CopyTextObject; private Text CopyText; private Text thisText; private RectTransform thisTextRect; private Vector3 thisTextPosition; private Vector3 mousePosition; // Use this for initialization void Start () { canvasTran = transform.parent; } // Update is called once per frame void Update () { } // ドラック開始時 public void OnBeginDrag(PointerEventData eventData) { Debug.Log("drag Start"); //ドラッグ先テキスト thisText = this.GetComponentInChildren<Text> (); thisTextRect = GetComponent<RectTransform>(); thisTextPosition = thisTextRect.localPosition; CreateDragObject (); } // ドラック中 public void OnDrag(PointerEventData eventData) { Debug.Log("dragging"); mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10); CopyText.transform.position = Camera.main.ScreenToWorldPoint (mousePosition); } // ドラック終了時 public void OnEndDrag(PointerEventData eventData) { Debug.Log("dragEnd"); Debug.Log("thisText = " + thisText.text); Debug.Log("copyText = " + CopyText.text); } private void CreateDragObject(){ CopyTextObject = new GameObject ("copyText"); CopyTextObject.transform.SetParent (canvasTran); //最前面表示 CopyTextObject.transform.SetAsLastSibling (); CopyTextObject.transform.localScale = Vector3.one; CopyTextObject.transform.localPosition = thisTextPosition; CopyText = CopyTextObject.AddComponent<Text> (); CopyText.text = "Copy!"; CopyText.font = Resources.FindObjectsOfTypeAll<Font>()[0]; CopyText.fontSize = thisText.fontSize; CopyText.color = Color.white; CopyText.alignment = TextAnchor.MiddleCenter; } }
あくまで私の理解ですよ。間違いも多々あると思います。
さて、まず、宣言のところ。
private Transform canvasTran; private GameObject CopyTextObject; private Text CopyText;
ゲームのオブジェクトを配置しているキャンバスと親子関係を持たせるための「canvasTran」。
ドラッグ先のコピー用テキストのゲームオブジェクトしての宣言のための「CopyTextObject」。
そのゲームオブジェクトにつけるコピー用テキスト「CopyText」。
初めは、「CopyText」だけでゲームオブジェクトとして成り立つかと思ったのですが、どうやら、ゲームオブジェクトの中のテキストという位置付けのよう。単体では表示されませんでした。
private Text thisText; private RectTransform thisTextRect; private Vector3 thisTextPosition;
ドラッグ先の(コピー元の)テキスト情報を保持するためのもの。位置(ポジション?)情報などをコピー先に渡すためのもの。
void Start () { canvasTran = transform.parent; }
スクリプトでオブジェクトを作成するのですが、他オブジェクトと同じくキャンバスさんの子供として扱って欲しいのです。なので、親子関係の情報を取って置きます。コピーオブジェクトにも持たせてやるから。
ドラッグのたびにやる必要はないので、スタートで取っておく。
・記事名:オブジェクトの親子関係のまとめ
・サイトリンク:http://qiita.com/hiroyuki7/items/95c66aee26115cf24a19
// ドラック開始時 public void OnBeginDrag(PointerEventData eventData) { Debug.Log("drag Start"); //ドラッグ先テキスト thisText = this.GetComponentInChildren<Text> (); thisTextRect = GetComponent<RectTransform>(); thisTextPosition = thisTextRect.localPosition; CreateDragObject (); }
ドラッグを開始したら、ドラッグ先のテキスト情報を取っておいて、コピーオブジェクト作成メソッドへ。
private void CreateDragObject(){ CopyTextObject = new GameObject ("copyText"); CopyTextObject.transform.SetParent (canvasTran); //最前面表示 CopyTextObject.transform.SetAsLastSibling (); CopyTextObject.transform.localScale = Vector3.one; CopyTextObject.transform.localPosition = thisTextPosition; CopyText = CopyTextObject.AddComponent<Text> (); CopyText.text = "Copy!"; CopyText.font = Resources.FindObjectsOfTypeAll<Font>()[0]; CopyText.fontSize = thisText.fontSize; CopyText.color = Color.white; CopyText.alignment = TextAnchor.MiddleCenter; }
ここでちょっと手こずった。やはりuGUIは偉大ですねぇ。スクリプトオブジェクト作るの面倒臭い。全部設定してやらないと出てこない。
初期状態の位置とか、どう表示させるか、フォントのサイズから種類から真ん中寄席の情報やら。
先に枠だけおいておいた「CopyTextObject」をチャット、ゲームオブジェクトして名前を与えて宣言してあげます。これによって、ドラッグを開始した時に初っ端はなかった「copyText」というオブジェクトがキャンバスにできます。
まだ、DragEnd処理で削除とかしないので、ドラッグが終わってもそのままオブジェクトは残っています。
// ドラック中 public void OnDrag(PointerEventData eventData) { Debug.Log("dragging"); mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10); CopyText.transform.position = Camera.main.ScreenToWorldPoint (mousePosition); }
前回はドラッグ先オブジェクトにmousepositionを入れていたけど、それをCopyTextさんに設定すればこの状態に。
コピーオブジェクトがずっと残りっぱなしだとうっとおしので、削除する処理をちらりと入れました。
// ドラック終了時 public void OnEndDrag(PointerEventData eventData) { Debug.Log("dragEnd"); Destroy (CopyTextObject); }
これだけ。
あとは、コピーオブジェクトのテキストを、ドラッグ先のテキストにしてやりました。あとはカーソルのせいで文字がうまく見えないので大きくして見た。
結果はこう。
終わり。
ドロップ処理は、今のところ予定ない。
勝手に、こうすればすぐできるだろうと思うこむことがよくあって、変に詰まることがよくある。本当によくある。
この思い込みでものすごい時間をかけたりする。
今日は「ドラッグ&ドロップ」をやってみようと思いました。
簡単なパズルゲーム(またもや算数系アプリで)を作ってみようと思っているのですが、ドラッグ&ドロップを使うかは、まだ未定。だったのですが。
ドラッグの動きを見て「これじゃない」と思ったので、ドロップまで行かなかった。使わないと思った瞬間からやりたくなくなったから。
とりあえず、やって見たところまでは記事にします。
ちなみに、ゲームそのものは、純粋にクリックするだけの動きにしようとも思っています。
参考にしたサイト。
・記事名:uGUIでドラッグについてちょっとだけ詳しく
・サイトリンク:http://qiita.com/okuhiiro/items/4c313038798da6923205
配置したuGUIの「Text」さんは、下の四つのボタンを押すと、押したボタンの数字に変化するようにしました。
で、私がこの「ドラッグ&ドロップ」でここから何がやりたかったというと、「1」のボタンをドラッグして「2」のボタンにトロップさせると、「3」になるという足し算仕組み。
ソースはこちら。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class DragAndDrop: MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } // ドラック開始時 public void OnBeginDrag(PointerEventData eventData) { Debug.Log("drag Start"); } // ドラック中 public void OnDrag(PointerEventData eventData) { Debug.Log("dragging"); } // ドラック終了時 public void OnEndDrag(PointerEventData eventData) { Debug.Log("dragEnd"); } }
drag&dropは「EventSystems」にある機能らしい。なので、使わせての宣言をする。
これを抜かして怒られました。
using UnityEngine.EventSystems;
ドラッグ開始時は「OnBeginDrag」というメソッドで、ドラッグ中は「OnDrag」、ドラッグ完了後(離した後?)「OnEndDrag」でそれぞれ行われます。これを実際に動かしてみると、以下の通り。
「1」にこのスクリプトをアタッチしています。ただ、オブジェクトが動く処理は入れていないので・・・。
Debugは吐き出しているけど、動いているのかいまいちわからない状態に。
「1」を動かすよう、「OnDrag」処理に位置情報を追加してやります。
// ドラック中 public void OnDrag(PointerEventData eventData) { Debug.Log("dragging"); Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10); this.transform.position = Camera.main.ScreenToWorldPoint(mousePosition); }
スクリプトが付いているオブジェクトさんをマウスポジションに動かしてあげます。
どこ?!
ドラッグっぽい動きを0.1秒くらいして消えました。左下にいます。「1」さん。
数字すら見えない状態。ということは、もしかして位置情報が、uGUIさんたちと、マウスさんで噛み合っていないということかしら。
ということで、調べると、おそらくこれでしょう。
今回もお世話になります、椿さんのテラシュールブログ。
Canvasの「Render Mode」wp「ScreenSpace-Camera」へ変更。
「Render Camera」カメラは、一つあるMain Cameraを追加してあげます。そうするとほら。治った。
やはり、簡単なテストプロジェクトを開いて作って見てからやればどんな感じなのかわかりますね。
ドラッグ&ドロップ処理をしようとして、ドラッグの時点でこれじゃないと思ったので、ドロップ処理は、無視。
こんなに滑らかに動いてほしい訳でもなく、自由に色々動いて欲しい訳でもなく、範囲を決めて動かせればいいじゃんという感じの動きでもない。もっと硬い感じで動いて欲しかった。
結局使わなかったけれど、おそらくこれが一番参考になるのではと思った記事。
・記事名:uGUIでドラッグドロップ
・サイトリンク:http://qiita.com/ayumegu/items/c07594f408363f73008c
いつもながらハマるけど。何にハマったのかというと、今回は宣言。
◆記事:UnityでCSVを読み込むときの軽いメモ
◆サイトリンク:http://qiita.com/tt-coder/items/68e81a64664b769f3755
言われた通りにやればできました。
ソースは全くいじっていない。宣言が必要でしたね。
初っ端にこれを宣言する。
なんでこれがわかったのかというと、エラーが教えてくれました。
エラーの内容でググれば出てきた(外国のサイトが)。
using System.IO;
Unityでアプリ開発の良さって、情報が溢れていることね。
初心者でもちょっとの山(うまくいかないときのあの山)を越えれば、すんなりできると思います。
私ができているからにはできるんじゃないかな。
C#とか、大学以来やるけどなんだかんだいけますね。
今やっているのは、これを読み込んで会話シーンを作ることですが、忘れそうだったのでメモメモ。
昨日の、シナリオ書き出しをCSVからとって表示する方法にしました。
結果はこの通り。上がCSV読み取り。下が素敵なブロガーさんのそのままのソース。
CSV読み込みソースも、テキスト表示ソースも-ほぼ-そのまま。
やったといえば、publicでシナリオを書き込むんじゃ無くしただけ。
scenariosの情報をスクリプトで設定するようにしただけ。
[SerializeField] string[] scenarios; // 会話内容
この部分を、無くした。CSVの配列を設定してやるから。
こうして、Startの部分のCSV読みこむ。
void Start() { Debug.Log ("start"); CSVName = "sample"; CSVNumber = "0"; // Resouces/CSV下のCSV読み込み csvFile = Resources.Load("CSV/" + CSVName + CSVNumber) as TextAsset; StringReader reader = new StringReader(csvFile.text); while(reader.Peek() > -1) { string line = reader.ReadLine(); // 配列に格納 csvDatas.Add(line.Split(',')); // 行数加算 height++; } }
uGUIのところから入れていたシナリオの長さは、CSVの行数を入れればよい。
なので、あとは、表示したいcsvDatasの2列目(このcsvの1列目には人の名前が、2列目にセリフを入れたつもり)をuiTextに表示するシナリオに格納させる。
/// 初期化 void Initialize() { isCompleteLine = false; uiText.text = ""; //currentText = senarios[currentline]; currentText = csvDatas[currentLine][1]; textSpeed = TEXT_SPEED + (currentText.Length * TEXT_SPEED_STRING); LineUpdate(); } /// 会話シーン更新 IEnumerator ScenarioCoroutine() { while(true) { yield return null; // 画面を押した時、次の内容へ if(isCompleteLine && Input.GetMouseButton(0)) { yield return new WaitForSeconds(completeLineDelay); //if(currentLine > scenarios.Length - 1) if(currentLine > height - 1) { ScenarioEnd(); yield break; } Initialize(); } // 表示中にボタンが押されたら全部表示 else if(!isCompleteLine && Input.GetMouseButton(0)) { iTween.Stop(); TextUpdate(currentText.Length); // 全部表示 TextEnd(); yield return new WaitForSeconds(completeLineDelay); } } }
ということで、 「//currentText = senarios[currentline];」
これを潰して、csvの配列を指定。「currentText = csvDatas[currentLine][1];」
もう一つ、「//if(currentLine > scenarios.Length – 1)」の長さは、「hight」がルノで、それに変更。「if(currentLine > height – 1)」
日本語がおかしい気がする。
今日の私は理解して書いているけど、明日の私がわかるだろうか。
個人開発者。
フリーランスを名乗れるように日々頑張っています。が、サラリーを受け取っています。
UnityでAndroidアプリを作成中。Appleへお金が払えるほど儲ければ,
IPhoneアプリも作成したいな。
詳しいところは「About Me」を確認ください。
© Copyright 2017 「It Happens」 All rights reserved.