gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

Unity 物体の追従にはJointが必要な場合がある

Unityは便利なもので,Hierarchyで子要素に指定してあげると,親要素が移動回転スケール変更したときに一緒に移動回転してくれます

f:id:kamiwo_koete:20160813201205p:plain

 

ただ,それをやってくれない場合があります.

それはrigidbodyがついている場合です.

この場合,両方にrigidbodyを追加し,片方のオブジェクトにJoint類を追加します

Unityには3Dの場合

* Fixed Joint

* Spring Joint

* Hinge Joint

があります.

上記のように座標変換的に使用したい場合はFixed Jointを使用するとよい

f:id:kamiwo_koete:20160813201554p:plain

Latex bibtex コンパイルできない

いろいろ原因はあると思うのですが,僕の場合のメモ.

他の人にも適用できるかもしれないので.

 

どうにも図とbibtexコンパイルを同時にするとおかしくなる場合があるみたいです.

ですので

\bibliography{test.bib}

コメントアウトして一回コンパイル

二回目はコメントアウトを戻して普通にコンパイルする

と僕はうまくいきました.

 

 

Unity MeshFilter アクセスできない

MeshFilterはメッシュの大きさ等を取得できたりするコンポーネントです

MeshFilter f = GetComponent<MeshFilter>();
Vector3 size = f.mesh.bounds.max - f.mesh.bounds.min; //meshを包括するboxのサイズを取得(できるはず)

けどこんなエラーがでて困ってました.
Not allowed to access MeshFilter.mesh on prefab object. Use MeshFilter.sharedMesh instead UnityEngine.MeshFilter:get_mesh()

結果的にはprefabの要素にアクセスしてたのでエラーが出てました.
つまりこんな感じ

GameObject prefab = (GameObject)Resources.Load ("Prefabs/model");
MeshFilter f = prefab.GetComponent<MeshFilter>();
Vector3 size = f.mesh.bounds.max - f.mesh.bounds.min; //meshを包括するboxのサイズを取得(できるはず)

ですので,実体化?させたものを対象にすればエラーが取れました

GameObject prefab = (GameObject)Resources.Load ("Prefabs/model");
GameObject obj =(GameObject)Instantiate(prefab, Vector3.zero, Quaternion.identity);
MeshFilter f = obj.GetComponent<MeshFilter>();
Vector3 size = f.mesh.bounds.max - f.mesh.bounds.min; //meshを包括するboxのサイズを取得(できるはず)

ただ,エラーがおっしゃってる解決方法
instead UnityEngine.MeshFilter:get_mesh()
がよくわかりませんでした(使い方?がわからない)

OpenCV ウインドウ 枠 (ほぼ)非表示

OpenCVでウインドウの枠を非表示にしたいと思いました
f:id:kamiwo_koete:20160309110035p:plain
これのタイトルとか外枠ですね

ソースはこれ.WINAPIを使用して,ウインドウを弄ります.
環境は C++, windows7 64bit
適当に書いてるので変数などは随時補完してください

#include "windows.h"

std::string WINNAME = "test";

//ウインドウ作成
cv::namedWindow(WINNAME, CV_WINDOW_NORMAL);

//WinAPIでウインドウの設定を弄る
HWND a = FindWindow(NULL, WINNAME.c_str());  //名前からウインドウを検索 std::stringからLPCTSTR変換をしている
SetWindowLongPtr(a, GWL_STYLE, WS_POPUP); //WS_THICKFRAME : 細枠 | WS_POPUP 枠ほぼなし
SetWindowPos(a, NULL, movex, movey, width, height, SWP_DRAWFRAME | SWP_SHOWWINDOW | SWP_FRAMECHANGED); //これがないと再描画されない

cv::imshow(WINNAME, img);
cv::waitKey(0);

でこうなります.わかりにくい・・・
f:id:kamiwo_koete:20160309110835p:plain

SetWindowPosは実行しないと再描画されないみたいです.またSWP~のパラメータはこうすれば動いただけなので不必要なものがまぎれているかも

Unity5 UGUIをドラッグで移動させる

Unity5において,UGUI(PanelとかButtonなど)をドラッグで移動させます.
通常のGameObjectだとググレばすぐ出てくるのですが,GUIを動かすとなるとちょっと困りました

ソースはこれです

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;


public class Drop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler{

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}

    public void OnBeginDrag(PointerEventData eventData)
    {
    }

    public void OnDrag(PointerEventData eventData)
    {
        GetComponent<RectTransform>().position += new Vector3(eventData.delta.x, eventData.delta.y, 0.0f);
    }
    
    public void OnEndDrag(PointerEventData eventData)
    {
    }

}

ポイントとしては
・I~Handlerの継承
・ドラッグ中のイベント「OnDrag」内で,移動量eventData.deltaを足していく
です

【追記】
GetComponent().localPosition ⇒ GetComponent().position に変更

参考
unity4.6 beta / uGUI ドラッグ編 - petlustpetlust.hateblo.jp

Unity5 Android 通信のお話

Unity5でAndroidに対応したアプリを作ろうとしたときの備忘録を二つほど
エディタ上ではうまくいくのに,Androidのアプリにした途端,通信がうまくいかなくなった

ポート番号のせい?⇒おそらく書き方の問題

ググれば腐るほど出てくるんですが,

string URL = "aaa.com";
var www = new WWW(URL, sendbytes, header);

みたいな感じでデータをPOSTすることができます.

ただ,ぼくはURLの部分を

string URL = "aaa.com:30000";

みたいにしたらエディタ画面と,Windows用にエクスポートしたゲームでは通信できるんですが,Androidだとできませんでした.
なので,嫌々

string URL = "http://aaa.com";

にして,サーバー側のポート番号も30000⇒80にしました.そしたら動きました.よくわからない

追記
おそらく"http://"から始まらないと無理っぽい

エラー吐いたら後のコードは実行されないということの再確認

ボタンを押したらスクショして送信,みたいなことしようとしてました.
ですけど送信できなかったんですよね.

原因としては,デバッグ用にローカルにスクショを保存していて,保存のパスがWindowsAndroidで互換性?がなかったからです.
IsolationStorageException吐いてました.
確認方法としては,

adb logcat | grep com.bb.aa

(com.bb.aaはUnityで設定したときのもの)
でそのアプリの出力を見てました.

で,そのエラーのあとに送信のプログラムがあったので,動いていなかった.それだけ