忍者ブログ
  • 2024.04
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 2024.06
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/05/03 10:52 】 |
Unityで課金処理
SOOMLAを使うと便利

参考


PR
【2015/12/11 22:20 】 | UNITY | 有り難いご意見(0)
画面のサイズ
Screen.width
Screen.height
は、端末のサイズに依存する。
また、Unity上実行では、Gameビューのサイズに応じて変わる。

マウス位置を取得したいときは、
Input.mousePosition()
で取得できるが、これはScreenのサイズ。つまり端末やGameビューサイズによって変わる。

そこで、想定ゲーム画面サイズに変換するには


const float SCREEN_WIDTH = 640;
const float SCREEN_HEIGHT = 1136;
Vector3 getTouchPositionInScreen() {
Vector3 touchPos = Input.mousePosition;
float x = touchPos.x / Screen.width * SCREEN_WIDTH;
float y = touchPos.y / Screen.height * SCREEN_HEIGHT;
return new Vector3 (x, y);
}




呼び出し側は、
タッチから取得する場合(スマホ実機用。Unity上では反応しない)

for (int i = 0; i < Input.touchCount; ++i) {
Touch touch = Input.GetTouch(i);
if (touch.phase == TouchPhase.Moved) {
Vector3 touchPos = getTouchPositionInScreen();
print(touchPos);
}
}




マウスで取得する場合(Unity上でも実機上でも動く)

if (Input.GetMouseButton(0)) {
Vector3 touchPos = getTouchPositionInScreen();
print(touchPos);
}





のような感じになる。

このとき、シーン内のカメラやテクスチャ等全てのオブジェクトが左下を(0,0)基準で置いてあること。
Unity空間の原点が、カメラ(つまりスクリーン)の中心の場合は、上の関数で言うと、画面半分だけ戻り値のVectorの値を足す(右上に移動する)ことが必要。
【2015/09/26 13:04 】 | UNITY | 有り難いご意見(0)
2Dの表示
2D設定でプロジェクトを作成。

テクスチャは、画像ファイルをそのままアセットに入れて、シーンに配置してやればよい。
Transitionのx,y,zは全部0にしておけば、中心に配置される。
このとき、
Pixels per Unit
の項目が、デフォルトで「100」になっている。

つまり、テクスチャの100pixelがUnity上で1メートルになるサイズで配置されている訳だ。




ということは、640x1136の画像なら
6.4m x 11.36m の大きさでUnity空間に置いてあることになる。


ここで、カメラ(もちろん平行投影=Orthographicになっている。2D設定でプロジェクトを作っていれば。)の設定も行う。
カメラが映す範囲は、
Orthographicの下の Size で指定する。(スクリプト上では、orthographicSize というプロパティ)
これは、カメラが映す範囲の高さの半分の値。
なので、1136pxlの場合、568になる。

ただし、これはメートルであることに注意。
さっき、Pixels per Unitが100だったので、
実際に指定する値は
「5.68」
になる。




Pixels per Unitを1にして、dots by dotにしたほうが便利なのでは?

→全体がでかくなり過ぎ(640m x 1.136km)て、あたり判定とか演算が面倒?

とりあえず同じことだと思うので、このままでいいんじゃない?
【2015/09/26 12:38 】 | UNITY | 有り難いご意見(0)
アニメーションカーブを取得する
アニメーションクリップに入っているカーブを取得する方法。
とても発見しにくいが、AnimationUtilityというクラスにある。

AnimationClipCurveData[] curveData = AnimationUtility.GetAllCurves(srcClip);
foreach (AnimationClipCurveData curveDatum in curveData) {
AnimationCurve newCurve = curveDatum.curve;
print("CURVE: " + curveDatum.type + "," + curveDatum.propertyName);

という感じで使う。

【2012/03/02 03:17 】 | UNITY | 有り難いご意見(0)
メッシュコンバイン
DrawCallを減らすために、いくつかのメッシュ(ひとまずキューブ)をまとめて1つのオブジェクトにするスクリプトを作ってみる。

キューブその他のオブジェクトを作ると(GameObject->Create Others -> Cubeとか)、
コンポーネントとしては
- Transform
- Cube(Mesh filter)
- Cube Collider
- Mesh Renderer
の4つがついたゲームオブジェクトが生成される。
TransformとColliderは置いといて、MeshFilterにまず注目。

見ると、Meshというプロパティがあり、Cubeというメッシュが入っている。
ここをクリックすると、プロジェクト内にあるメッシュの一覧が別画面で出る。ここから選んだメッシュがこのゲームオブジェクトになるわけ。
最初はたぶん、Cube,Sphere,Capsule,Plane,Cylinder の5つがある。
ここからメッシュを選んだらゲームに映るわけ。

公式のリファレンスを見てみる。
http://unity3d.com/support/documentation/ScriptReference/Mesh.html
Meshクラスには、vertex配列がある。
同じ長さのnormal, tex coords0, tex coords1, color, tangent配列がある。(これらは任意)
で、三角形はvertex配列へのインデックスとして表現する。

コンバインすること自体は、便利なことに関数が用意されてる。
http://unity3d.com/support/documentation/ScriptReference/Mesh.CombineMeshes.html
もうこのサンプルをコピーして書くだけ。
マテリアルさえ一緒なら、見た目はまったくそのまま変わらないし、DrawCallも1回になるはずだ。

【2012/02/29 15:20 】 | UNITY | 有り難いご意見(0)
<<前ページ | ホーム |