スロットゲーム制作 リール作成自動化

Blender

前回の記事でスロットのリール作成をBlender上で行いましたが
図柄の配列を変えるたびに画像を作り変えるのも面倒なので
リール(シリンダー形状のメッシュ)の作成とUV値の設定を自動化しました。

図柄テクスチャの作成

まずはリールに設定する図柄を一枚のテクスチャへ整理しました。
各図柄の大きさは横280px 縦156pxとなっています。

メッシュ作成を行うためのスクリプト作成

スクリプトを書くためのウインドウを開きます
(Text Editor)

何でも良いので.py拡張子で名前を付けて作成します。

ここまでで、スクリプトを書く準備はできました。
スクリプトはpythonで記述します。

スクリプト:各図柄の識別子

個々の図柄に対して以下のような識別子を作ります。

seven=0
cherry=1
bar=3
puramu=2
bell=5
suika=4

スクリプト:各図柄のUV座標

各図柄のUV値(テクスチャ上の座標)を下記のように配列で記載します。
ここの値は後に0.0~1.0の小数に変更してメッシュに設定します。

zu_px = 280
zu_py = 156

zugara = [
    #7
    [0,0,zu_px,zu_py*1],
    #cherry
    [zu_px,0,zu_px*2,zu_py*1],
    # puramu
    [zu_px*2,0,zu_px*3,zu_py*1],
    # BAR
    [zu_px*0,zu_py*1,zu_px*1,zu_py*2],
    # suika
    [zu_px*1,zu_py*1,zu_px*2,zu_py*2],
    # bell
    [zu_px*2,zu_py*1,zu_px*3,zu_py*2],
]

スクリプト:リールの配列

リーズの図柄を回転の順に記載します(左側のリール)

left=[
    seven,
    cherry,
    bar,
    puramu,
    bell,
    suika,
    bell,
    puramu,
    bar,
    suika,
    bell,
    puramu,
    cherry,
    seven,
    puramu,
    bell,
    suika,
    seven,
    suika,
    puramu,
    bell,
]

スクリプト:メッシュ作成

メッシュを作るスクリプト部分を記載します。

def create_cylinder_with_front_uv(obj_name,xoff,segments, radius, width, zugaras):
    # メッシュとオブジェクトを作成
    mesh = bpy.data.meshes.new("CylinderMesh")
    obj = bpy.data.objects.new(obj_name, mesh)
    bpy.context.collection.objects.link(obj)
    bpy.context.view_layer.objects.active = obj
    obj.select_set(True)
    
    # bmeshでシリンダーを作成
    bm = bmesh.new()
    angle_step = 2 * math.pi / segments

    # 左部と右部の円に沿って頂点を作成
    left_verts = []
    right_verts = []
    for i in range(segments):
        angle = i * angle_step
        y = -math.cos(angle) * radius
        z = math.sin(angle) * radius
        left_verts.append(bm.verts.new((-width/2+xoff, y, z)))
        right_verts.append(bm.verts.new((width/2+xoff, y, z)))
    
    bm.verts.ensure_lookup_table()

    # 側面の面を作成
    # Hantokei mawari
    faces = []
    for i in range(segments):
        v1 = left_verts[i]
        v4 = left_verts[(i + 1) % segments]
        v3 = right_verts[(i + 1) % segments]
        v2 = right_verts[i]
        face = bm.faces.new((v1, v2, v3, v4))
        faces.append(face)

    # 上面と下面の面を作成
    #bm.faces.new(left_verts)
    #bm.faces.new(reversed(right_verts))

    # UVマップを追加
    uv_layer = bm.loops.layers.uv.new("UVMap")

    # 正面の面にのみUVを設定
    for i,zu in enumerate(zugaras):
        map = zugara[zu]
        print(zu)
        u0 = map[0]
        v0 = map[1]
        u1 = map[2]
        v1 = map[3]        
    face = faces[i]
        # UV座標を設定 (四角いUVの配置)
        # LB
        face.loops[0][uv_layer].uv = (u0/1024, 1.0-v1/1024)
        # LT
        face.loops[3][uv_layer].uv = (u0/1024, 1.0-v0/1024)
        # RT
        face.loops[2][uv_layer].uv = (u1/1024, 1.0-v0/1024)
        # RB
        face.loops[1][uv_layer].uv = (u1/1024, 1.0-v1/1024)

    # メッシュデータを更新してオブジェクトにリンク
    bm.to_mesh(mesh)
    bm.free()

スクリプト:メッシュ作成呼び出し

最後にここまでで用意したデータと関数を結びつけるように
メッシュ作成関数を呼び出します。

create_cylinder_with_front_uv(obj_name="ReelL",xoff=-0.1,segments=21, radius=0.15, width=0.09, zugaras=left)
#obj_name:オブジェクト名
#xoff:リールメッシュのX位置(中心点)
#segments:面の数(図柄のコマの数)
#radius:リール半径(0.15=15cm)
#width:リールのコマの幅
#zugaras:図柄の並びデータ

メッシュ作成

Text Editor上部にある「Run Script」ボタンをクリックするとリールオブジェクトが作成されます!

コメント

タイトルとURLをコピーしました