1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Godot】UVスクロールをスクリプトだけで実装する方法

1
Last updated at Posted at 2021-02-12

概要

このページでは以下のようなUVスクロールをスクリプトだけで実装する方法について書きます。
shot.gif

UVスクロールをするスクリプト

プロジェクトを新規作成し、2Dノードを作成、名前を「Main」に変更して以下のスクリプトをアタッチします。

Main.gd
extends Node2D

# テクスチャを読み込んでおく
var tex = preload("res://icon.png")
# 時間経過で変化するUVのUの値
var time_u = 0

func _ready():
	# テクスチャリピートを有効にする
	tex.flags |= Texture.FLAG_REPEAT

func _process(delta):
	# 経過時間でUVスクロールする
	time_u += delta
	if time_u > 1:
		# 0.0〜1.0となるようにする
		time_u -= 1
	
	# _draw() を呼び出す
	update()

func _draw():
	# 左上座標
	var x = 30
	var y = 50
	
	# 画像の幅と高さ
	var width = tex.get_width()
	var height = tex.get_height()
	
	# 頂点リストを作成
	var points = PoolVector2Array()
	points.append(Vector2(x, y))
	points.append(Vector2(x+width, y))
	points.append(Vector2(x+width, y+height))
	points.append(Vector2(x, y+height))
	
	# 色を設定
	var colors = PoolColorArray([Color.white])
	
	# UVリストを作成.
	var uvs = PoolVector2Array()
	var u = time_u
	uvs.append(Vector2(u, 0))
	uvs.append(Vector2(1+u, 0))
	uvs.append(Vector2(1+u, 1))
	uvs.append(Vector2(u, 1))
	
	# ポリゴンを描画.
	draw_polygon(points, colors, uvs, tex)

簡単に説明すると _ready() の部分で、tex.flags |= Texture.FLAG_REPEAT とすることでUV値を変化してはみ出した場合 (0.0〜1.0を超える値を指定した場合)に、テクスチャを繰り返して描画する設定にしています。

あとは、_draw() で、draw_polygon() を使用して、UV値をずらして描画することで、UVスクロールが実装できます。

UVとは

UVとはテクスチャの左上を(0, 0)、右下を(1, 1)とした座標系のことです。
名称未設定.png

左上の座標を (0, 0) 〜 (1, 0)、右下の座標系を (1, 0) 〜 (2, 0) に変化させることで、スクロール処理を実装していることとなります。

たとえば、テクスチャリピートを有効にした状態で、0.5 ずらすと以下のような状態となります。
名称未設定.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?