うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】ジグソーパズルの自動生成 ~6~

生成したピースの Pivot

現状すべてのピースの GameObject を (0, 0, 0) 座標に生成しており頂点をずらすことで並べている
f:id:hacchi_man:20200113200936p:plain:h500

そのため、ピースを回転させたりする場合 Pivot が (0, 0, 0) なので
Z回転を入れると下図のように意図しない回転になる
f:id:hacchi_man:20200113202259p:plain:h500

Pivot 調整

f:id:hacchi_man:20200224014417p:plain

少し見づらいが3×3の場合 (1, 2) のピースの Pivot を中心に移動させたい場合
横に1ピース半、縦に2ピース半移動させれば Pivot が中心にくる

あとは座標によってずらす位置が違うのでそれを踏まえると以下のようにすればpivotを中心にできる

// postionが(0, 0)などの位置
// 1ピースのサイズをテクスチャから計算 (テクスチャサイズ / 分割数)
var size = param.TextureSize / param.Size;

mesh.vertices = mesh.vertices
    .Select(v => new Vector3(
        v.x - size.x * position.x - size.x / 2f,
        v.y - size.y * position.y - size.y / 2f,
        v.z)
    ).ToArray();

LocalPosition の調整

f:id:hacchi_man:20200224014833p:plain

すべての Pivot を中心に持ってきたので生成するピースの座標を変更しない場合すべてが中心に来てしまう
※実際にジグソーパズルとして遊ぶ場合はバラバラで問題無いが・・・

f:id:hacchi_man:20200224015659p:plain

(0, 0) のピースを正しい位置にする場合はテクスチャの半分の座標引き、縦横0.5ピース足せば正しい位置になる (1, 2) のピースを正しい位置にする場合はテクスチャの半分の座標引き、縦2.5ピース横1.5ピース足せば正しい位置になる

obj.transform.localPosition = -size * param.Size / 2f + size * position + size / 2f;

これで正しい位置に配置することができました

f:id:hacchi_man:20200224020012p:plain