Takunojiのプログラミング・プレイグラウンド(遊び場)

Javaプログラミングを基本にして、ゲーム作成に必要なことの調査結果、やったら面白そうなことなどを記載します。プログラミングのススメ的なことも記載します。プログラミングで楽しく遊ぶために色々と記載して行きます。

Blender python UI開発メモ 〜 ユーザ入力〜

pythonからJavaを使用する

https://stackoverflow.com/questions/3652554/calling-java-from-python?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

 

 blenderでユーザー入力を行うにはダイヤログを使う事にする

https://stackoverflow.com/questions/15595124/input-dialog-box-blender?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

 

複数行テキストフィールド

https://developer.blender.org/D622

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
 

Unity Error トラブル〜全角の文字決定時にEnter Keyアクションが動く〜

[2018/04/15]
iPhoneでのアプリケーションを作成する時には、入力部分はXcode(swift)での実装が必要らしい。。。

以下のソースで実行した時に文字決定のエンターキーで処理が走ってしまい
文字決定の時と、コマンド入力時のエンターキーのアクションを判別したい。

    void Update() {
        if(inputField.isFocused) {
            inputField.MoveTextEnd(false);
        }
        if(Input.GetKeyDown(KeyCode.Return)) {
            string command = getInputCommand(inputField.text);
            if (command == String.Empty) {
                Debug.Log ("Break now:");
            } else {
                exeCommand (command);
                inputField.text = inputField.text + commandStart;
                inputField.MoveTextEnd(false);
            }
        }
    }
文字決定時には文字がすでに入力されているのか入力されていないのか不安定で
両方の場合がある。。。タチの悪いバグだ(笑)

こいつをやっつけるのには、文字決定時とコマンド入力時の判別を行わないとけないが
さて。。。
調べてみると「inputField.text」では、全角に対応できなくて
「inputTextField.textComponent.text」は対応している。。。らしい
でも、全角入力後に「改行が消える」という謎なバグがあぁぁぁぁ。。。

 

Unity Develop Tools 〜 C#のソースを編集する〜

UnityでC#の実装を行いたいときに使う
Windowsの場合、[Edit > Preferences]
Macの場合、[Unity > Preferences]

Macで記事を記載しているため、Macの場合です。

1.Unity -> Preference で右側のウィンドウを開く

f:id:Takunoji:20180412201211p:plain f:id:Takunoji:20180412201435p:plain

2.開いたウィンドウより[External Tools]を開きModeDevelop (built-in)を選択

f:id:Takunoji:20180412201723p:plain

4. 「install MonoDevelopTools」というボタンが表示されるのでクリック
 ダウンロードを開始、ダウンロード後 ↓

                         f:id:Takunoji:20180412202326p:plain

5.パッケージを開きインストール開始

f:id:Takunoji:20180412202201p:plain

f:id:Takunoji:20180412202430p:plain

インストール後に、C#ファイルを開く→MonoDevelopが開く

f:id:Takunoji:20180412202646p:plain    f:id:Takunoji:20180412202724p:plain

自分の場合は、結構重くて、起動に時間がかかりました。というかうまく起動できていなかったので、
Unityから起動(C#ファイルをダブルクリック) ではなく、別個に起動しました。

f:id:Takunoji:20180412203325p:plain

f:id:Takunoji:20180412203345p:plain

f:id:Takunoji:20180412203401p:plain

こんな感じです、C#で参照しているオブジェクトなどを探すのに便利です。
テキストエディタだとAPIドキュメントが手放せなくて作業スピードが落ちます(笑)

以上、でした。

Unity Script 開発メモ 〜Widgetコントロール〜

C#からJavaの呼び出し

github.com


任天堂プラットホーム

https://developer.nintendo.com

psvita向けに作る

http://japan.unity3d.com/blog/?p=1516

iOS実装について

https://docs.unity3d.com/ja/current/Manual/iphone-basic.html

 

やっぱり、日本語入力不可でコマンド入力だな⭐︎

 

入力設定

https://docs.unity3d.com/jp/current/Manual/script-InputField.html

 

本の3dモデル フリー

https://free3d.com/3d-models/book

基本アニメーション
unity3d.com

アニメーションclip作成

docs.unity3d.com

 

モーション作成

Unity キャラクタを歩かせるなど基本動作 EDSPG

この情報は助かった、C#で複数行の文字列が定義できる。
C#でヒアドキュメントmagelixir.wordpress.com


オブジェクトの生成

void Update(){
//スペースを押したら
if (Input.GetKeyDown (KeyCode.Space)) {
//Instantiate( 生成するオブジェクト, 場所, 回転 ); 回転はそのままなら↓
Instantiate (target, new Vector3 (1.0f, 2.0f, 0.0f), Quaternion.identity);
}

 

自動制御関連

http://gomafrontier.com/unity/1510

キーボード入力関連

https://docs.unity3d.com/ja/current/ScriptReference/KeyCode.html

実機でのテスト

https://unity3d.sakura.ne.jp/unity/unity-for-ios.html

ゲームデータ保存

http://magnaga.com/unity/2016/01/11/unity-save/

Unity Error Fix 〜InputFieldのインスタンスが取れない~

以下のようなエラーが出ます。
NullReferenceException: Object reference not set to an instance of an object
ConsoleWindow.Awake () (at Assets/Script/ConsoleWindow.cs:14)

<Code>
public InputField inputField;
public InputField inputField;
private string commandStart = "コマンド: >";

// Use this for initialization
void Awake () {
Debug.Log("ConsoleWindow.Start");
inputField.onEndEdit.AddListener(AcceptStringInput); InputComplete();
}

上記の赤色の部分で落ちます。
まぁトーゼンですわな。。。インスタンスも参照も取得してないし(笑)

で、inputField(変数)のインスタンス or 参照を取得する方法がわかりませんでした。
そして、ここのサイトにありました。
GameObjectの宣言は必要なく、直接「GetComponent()」で呼び出しができるので
「initialsObject」は必要ありませんでした。
→inputField = GetComponent<InputField>();で取得できました。

  1.  
  2. public class UIManagerScript : MonoBehaviour {
  3.         public GameObject initialsObject; // この行はいらない
  4.         InputField initialsField;
  5.         Text initialsFieldInput;
  6.  
  7.         public void Start(){
                     // initialsObjectもいらない
  8.              initialsField = initialsObject.GetComponent<InputField>();
  9.              initialsFieldInput = initialsField.GetComponent<Text>();
  10.        }
  11.  
  12.       public void otherFunction(){
  13.             Debug.Log(initialsFieldInput.text);
  14.             // error: Object reference not set to an instance of an object
  15.       }
  16. }

    f:id:Takunoji:20180412081836p:plain

    f:id:Takunoji:20180412081847p:plain

    以上です。

Unity Component InputField 〜アタッチって何?〜

Unityの使用方法について調べていると「アタッチ」という言葉が出てきます。

下のようになっているところに。。。

f:id:Takunoji:20180411224140p:plain

下のように追加することです。「ConsoleWindow(Script)」

f:id:Takunoji:20180411224150p:plain

やり方はドラッグ&ドロップ、対象のファイルをドラッグ

f:id:Takunoji:20180411224324p:plain

ドロップしようとすると下のように色が変わります。結果は上の方にあります。

f:id:Takunoji:20180411224407p:plain

以上です。

Unity Error Fix 〜InputFieldが動かない~

テキストフィールドに入力を行おうとしたら
以下のようなエラーが出ました。
/***********************************************************************
GameObject is already being activated or deactivated.
UnityEngine.EventSystems.EventSystem:Update()
***********************************************************************/

f:id:Takunoji:20180411210341p:plain

f:id:Takunoji:20180411210430p:plain

色々調べたが、見つかりませんで。。。
でも「既に非表示にしたか表示済みの状態で同じ処理をしようとした」時に
同じようなエラーメッセージが出力された。という情報を見つけ
ピンと閃きました。以下の部分
・On Value Change とOn End EditでGameObject.SetActiveを設定していました。

f:id:Takunoji:20180411210804p:plain

下記のOn Changeの時には他の処理をしたかったので以下のように変更しました。

f:id:Takunoji:20180411211118p:plain

これでとりあえずは、エラーを解消できました。

f:id:Takunoji:20180411211221p:plain

以上でした。

Unity Button Action 〜ボタン押下アクションを作る〜

Unityでのボタン作成方法
前提として、
・「Canvas」の上にGUIコンポーネントを作成する必要がある
・「Canvas」にコンポーネントを作成するので2Dでの作成時と同じようになる

1. Canvas, Buttonを作成します。

・Cavasの作成      ・Buttonの作成     

f:id:Takunoji:20180410205600p:plain            f:id:Takunoji:20180410205545p:plain

2. Emptyオブジェクトの作成、名前の変更

f:id:Takunoji:20180410210805p:plain f:id:Takunoji:20180410210900p:plain

3. Projectタブ > Create > Folderでフォルダを作成し
                                   > C# Scripyでスクリプトを作成する

f:id:Takunoji:20180410211120p:plain

4. 以下のようにクラスを作成

f:id:Takunoji:20180410211334p:plain

ポイントは、画面のコンポーネントを取得する方法
以下のように名前をUnity上でつけているものは

f:id:Takunoji:20180410211519p:plain GameObject.Find("コンポーネント名")
Ex:
cmdArea = GameObject.Find("CommandArea");

逆にコンポーネントの下にあるButton
cmdButton = GameObject.Find("コンポーネント名").GetComponent<Button>();
アクション時(クリックした時)のイベント(アクション)処理の登録

cmdButton.onClick.AddListener*1;

public onClickCmdButton(Button btn) {
     XXXX;

}
デバック処理
Debug.Log("*** onClickCmdButton ***");
}
ボタン押下で文字を表示したり消したりのアクションができました。

f:id:Takunoji:20180410212156p:plain  f:id:Takunoji:20180410212212p:plain
今日はここまでにします。

*1:) => onClickCmdButton(cmdButton

Blender Python 開発メモ 〜パネルの仕様〜

英語のサイトですが。。。

Panel(bpy_struct) — Blender 2.79.0 855d2955c49 - API documentation
日本語にすると

クラスbpy_struct bpy.types.Panel 

UI要素を含むパネル

bl_category
タイプ: 文字列、デフォルト ""、(決してなし)
bl_context

パネルが属するコンテキスト。(TODO:可能な組み合わせの説明bl_context / bl_region_type / bl_space_type)

タイプ: 文字列、デフォルト ""、(決してなし)
bl_idname

これが設定されている場合、パネルはカスタムIDを取得します。それ以外の場合は、パネルの定義に使用されるクラスの名前が使用されます。たとえば、クラス名が "OBJECT_PT_hello"で、bl_idnameがスクリプトによって設定されていない場合、bl_idname = "OBJECT_PT_hello"

タイプ: 文字列、デフォルト ""、(決してなし)
bl_label

パネルラベルは、三角形の右側のパネルのヘッダに表示パネルを収納するために使用しました

タイプ: 文字列、デフォルト ""、(決してなし)
bl_options

このパネルタイプのオプション

  • DEFAULT_CLOSEDDefault Closed パネルの作成時にパネルを開くか折りたたむ必要があるかどうかを定義します。
  • HIDE_HEADERHide Header、Falseに設定されている場合、パネルにはヘッダーが表示されます。このヘッダーには、パネルとラベルを折りたたむためのクリック可能な矢印が含まれています(bl_labelを参照)。
タイプ: {'DEFAULT_CLOSED'、 'HIDE_HEADER'}に設定された列挙型、デフォルト{'DEFAULT_CLOSED'}
bl_region_type

地域パネルがで使用されようとしています

タイプ: ['WINDOW'、 'HEADER'、 'C​​HANNELS'、 'TEMPORARY'、 'UI'、 'TOOLS'、 'TOOL_PROPS'、 'PREVIEW']、デフォルトの 'WINDOW'
bl_space_type

パネルが使用される空間

  • EMPTY 空の。
  • VIEW_3D 3Dビュー、3Dビューポート。
  • TIMELINE タイムライン、タイムライン、再生コントロール
  • GRAPH_EDITOR グラフエディタ、ドライバの編集、キーフレーム補間
  • DOPESHEET_EDITOR ドープシート、キーフレームのタイミングを調整します。
  • NLA_EDITOR NLAエディタ、アクションの結合とレイヤー。
  • IMAGE_EDITOR UV /イメージエディタ、画像とUVマップの表示と編集を行います。
  • CLIP_EDITOR ムービークリップエディタ、モーショントラッキングツール。
  • SEQUENCE_EDITOR ビデオシーケンスエディタ、ビデオ編集ツール。
  • NODE_EDITOR ノードエディタ、ノードベースシェーディングおよび合成ツールのエディタ
  • TEXT_EDITOR テキストエディタスクリプトの編集、およびファイル内のドキュメント。
  • LOGIC_EDITOR ロジックエディタ、ゲームロジック編集。
  • PROPERTIES プロパティ、アクティブオブジェクトおよび関連するデータブロックのプロパティを編集します。
  • OUTLINER Outliner、シーングラフの概要、利用可能なすべてのデータブロック。
  • USER_PREFERENCES ユーザー設定、永続的な設定を編集します。
  • INFO 情報、メインメニューバー、エラーメッセージのリスト(ドラッグ&ドロップで下にドラッグ)
  • FILE_BROWSER ファイルブラウザ、ファイルとアセットを参照します。
  • CONSOLE Python Console、高度な編集とスクリプト開発用のインタラクティブなプログラムコンソール。
タイプ: ''、 ''、 ''、 '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' 、 'PROPERTIES'、 'OUTLINER'、 'USER_PREFERENCES'、 'INFO'、 'FILE_BROWSER'、 'C​​ONSOLE']、デフォルト 'EMPTY'
bl_translation_context
タイプ: 文字列、デフォルト "*"、(決してなし)
layout

UIのパネルの構造を定義します。

タイプ: UILayout、(読取り専用)
text

XXX todo

タイプ: 文字列、デフォルト ""、(決してなし)
use_pin
タイプ: ブール値、デフォルトFalse
classmethod pollコンテキスト

このメソッドがnull以外の出力を返す場合は、パネルを描画できます

戻り値の型: ブール値
drawコンテキスト

パネル UIレイアウトにUI要素を描画する

draw_headerコンテキスト

UIエレメントをパネルのヘッダUIレイアウトに描画する

 

 

Blender Python Addon 〜チュートリアル2-3〜

前回は、カーソルの位置までコピーを作成するスクリプトを作成しました。
今回は、アドオンの部分を写経、ちょっといじります。
赤色になっている部分はちょいといじって名前を変えてみました

Addon Tutorial — Blender 2.78.0 e8299c8 - API documentation 

bl_info = {
"name": "Cursor Array Practice",
"category": "Object",
}

import bpy


class ObjectCursorArray(bpy.types.Operator):
"""Object Cursor Array"""
bl_idname = "object.cursor_array"
bl_label = "Cursor Array Practice"
bl_options = {'REGISTER', 'UNDO'}

def execute(self, context):
scene = context.scene
cursor = scene.cursor_location
obj = scene.objects.active

total = 10

for i in range(total):
obj_new = obj.copy()
scene.objects.link(obj_new)

factor = i / total
obj_new.location = (obj.location * factor) + (cursor * (1.0 - factor))

return {'FINISHED'}

def register():
bpy.utils.register_class(ObjectCursorArray)


def unregister():
bpy.utils.unregister_class(ObjectCursorArray)


if __name__ == "__main__":
register()
アドオンスクリプトを作成して実行すると以下のように動きます。

起動後に、3D画面上でスペースを押下します。
そして「Cursor Ar」まで入力すると作成したアドオンの名前が見つかります。

f:id:Takunoji:20180407180301p:plain

実行結果はこんな感じ

f:id:Takunoji:20180407180453p:plain

今までの勉強で
一つのスクリプトファイル上で作成するにはどうすれば良いか?
が理解できました。

ただ、作成したスクリプトがどの部分に表示されるのか?がわかりません。
全て、スペースで検索した時に表示されるものなのでしょうか?
前に作成したものはタブで選択することができました。。。
うーむ、この部分がわからない。。。

今回はここまでにします。

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)