2016年12月
« 11月    
 1234
567891011
12131415161718
19202122232425
262728293031  
カテゴリー
Unity : sceneの描画を単一のShaderで置き換える - 11月 22, 2014 by emesiw

WordPressだと記述が面倒になってきたので、Qiita始めました。
記事はこちらになります。

http://qiita.com/emesiw/items/c8828bdda593af8fce5f

Unity : LookRotation2D - 7月 5, 2014 by emesiw

2DでSpriteの向きを変えたいときなどに、
Quaternion.Euler()でrotationを作って
Quaternion.Lerp()で回転させるとねじれてしまうことがあったので、
2D版LookRotationを用意してみました。

//-----------------------------------------------------------------------
static public Quaternion LookRotation2D(Vector2 _vec,Vector2 _up){
  float tmpAng = (Mathf.Atan2(_vec.y,_vec.x)-Mathf.Atan2(_up.y,_up.x))*Mathf.Rad2Deg;
  return Quaternion.AngleAxis(tmpAng, Vector3.forward);
}
//-----------------------------------------------------------------------


_vecは進路方向、_upは移動の基準(前方)となる向きです。

lr2d

Unity : Line Mesh (2) - 5月 4, 2014 by emesiw

作成したメッシュのMeshTopologyが
MeshTopology.LineStrip だとDrawCallsが増えてしまうみたいです。
MeshTopology.LinesにすることでDrawCallsを抑えることができました。
CALL

Unity : Spriteのカラーを白~黒まで変化させる - 12月 23, 2013 by emesiw

4.3のアップデートで、Spriteが使えるようになりました!
テクスチャの一部を切り出して表示する機能がデフォルトで扱えるようになり、大変便利です。

Sprite的な使い方をする場合、たとえば敵にぶつかったときなど、白や赤に点滅させたいことがあります。
デフォルトでは白くできないのですが(黒~テクスチャの色まで)、スプライト用シェーダーに少し手を加えると白くできるようになります。

1 4.3用のbuilt-in shadersをダウンロード
2 Sprites-Default.shaderを開く


fixed4 frag(v2f IN) : COLOR
{
  return tex2D(_MainTex, IN.texcoord) * IN.color;
}


fixed4 frag(v2f IN) : COLOR
{
  fixed4 emi = tex2D (_MainTex, IN.texcoord) * _Color;
  emi *= IN.color;
  emi.rgb = emi.rgb*2+max(fixed3(0,0,0),IN.color.rgb-0.5)*2;
  return emi;
}

のように変更

4 適当な名前(“Sprites/Custom”,Sprites-custom.shader等)に変更して保存

5 上記シェーダーをSpriteRendererに適用

sprite2DVtxCol
Color(0.5,0.5,0.5,1.0)で元のテクスチャ色、0.0が黒、1.0が白となります。

衝突時刻の予測 - 12月 7, 2013 by emesiw

一定速度で動いているオブジェクトに弾を当てたい場合は、
あらかじめ敵の移動先を調べ、そこに向けて弾を発射する必要があります。

colli_calc

点qが一定速度で直線上を進んでいるとき、
Sq*t = Sp*t となる時刻tにおけるqの位置に向けて弾を撃てば当たります。

//-----------------------------------------------------------------------
//! 衝突時刻取得:(retがマイナスの場合はhitしない) 
//-----------------------------------------------------------------------
static public float getCollideTime(Vector3 q1, Vector3 qSpd, Vector3 p1, float ps){
  float ret = float.MinValue;
  Vector3 p0,q0;
  float qs = qSpd.magnitude;
  Vector3 q2 = q1+qSpd;
  float d = lineToLineDistance(out p0,out q0,p1,p1,q1,q2,false);
  // p1から直線q1q2におろした垂線の交点 を通る時間 t0
  float t0 = Vector3.Dot(qSpd.normalized,p0-q1)/qs;
  float a = qs*qs - ps*ps;
  float b = -(2*t0*qs*qs);
  float c = (t0*qs)*(t0*qs) + d*d;
  float aa = b*b - 4 * a * c;
  if(a==0.0f){
    ret = (-c/b);
  }else if(aa>0.0f){
    float t1 = (-b+Mathf.Sqrt(aa)) / (2*a);
    float t2 = (-b-Mathf.Sqrt(aa)) / (2*a);
    ret = Mathf.Min(t1,t2);
    if(ret<0.0f){
      ret = Mathf.Max(t1,t2);
    }
  }
  return ret;
}

collitimedetect

対プレイヤールーチンに用いるときはほどほどに。

« old Postsogtzuq
MY MOVIE
emesiw