C#で[KeyDown]イベントを設定してもキー検出されなかった。
原因は[KeyPreview]プロパティがfalseであった事だった。
trueにしたところキー検出されるようになった。
基本ではあるが、クリックイベントから抜けるコードをど忘れしたのでメモとして残しておく。
{
・・・
return false;
}
でイベントから抜けることができる。
ClosedXMLで読み取り専用で開いてデータだけが欲しい。
しかし、ClosedXMLにはその機能はなかったので、FileStreamを併用して実現できたのでメモしておく。
FileStream fs = new FileStream(path,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite)
using(var workbook = new XLWorkbook(fs, XLEventTracking.Disabled))
{
・・・
}
1行目のFileStreamでインスタンスを作成し、2行目でインスタンスを利用してExcelを開く処理とすることで読み取り専用として開くことができた。
コリジョンについて触れたので書いておく。
今回も学習サイトはYouTube。
今回作ったものは、「コインを取ったら消える」というだけのもの。
使用したノードは以下の二つ
BeginOverlapの出し方はSphereコンポーネントを右クリック→「Add Event」→「OnComponentBeginOverlapを追加」
DestoryActorはアクターがただ消えるだけのノード。
OnComponentBeginOverlapにDestoryActorを繋げるだけで触れると消えるイベントになる。
しかし、このままでは人以外の物にも当たり判定があるため人のみにあたり判定を付けるためにコリジョンのプロパティを変更する。
以上で人のみ(Pawnオブジェクト)のみに当たり判定が付いた。
今日からは、UE4(Unreal Engine 4)のブループリントも勉強していく。
手始めに移動する床について勉強したので書いておく。
勉強したサイト(YouTube)
少し長いが日本語で丁寧に説明してくれる。
制作物
移動する床を作る。今回はY値が800から2500までの間を繰り返し移動している床を作成する。
作成結果
結果は以下の通りである。
今回使用したノード
AddActorWorldOffsetが移動のメイン機能。
移動のスピードはDelra Locationを右クリック→「変数に昇格」を行い、変数として扱っている。
GetActorLocationはターゲットの現在の位置を知るためのノード
ここではブランチを使用して2500に到達したかをチェックしている。
なお、GetActorLocationは追加したときは
このように、Return Valueとなっているが、右クリック→「構造体ピンを分割」でXYZ方向の指定が可能となる。
片方で2500に到達するまでのブランチを設定しておき、もう片方で800に到達するまでのブランチを設定することにより、往復運動するようになった。
以上で、Y値が800から2500までの間を繰り返し移動するBPが完成した。
パスワードを生成するプログラムが欲しくなった。
こだわりとして
・パスワードの長さを指定できること
・数字は必ず含めること
・バックアップとしてテキストファイルに記録しておくこと
を盛り込んだ。
import string
import secrets
import re
import sys
import os
import datetime
def pass_gen(size=20):
chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
# 記号を含める場合
# chars += '%&$#()'
password = ''.join(secrets.choice(chars) for x in range(size))
if not Check_InWords_Num(password):
pass_gen(size)
exit
return password
#数字が含まれているかチェック
def Check_InWords_Num(password):
resutlt = re.search('[0-9]',password)
return resutlt
def Main():
pass_Length = input('パスワードの長さを指定してください。')
if not str.isdigit(pass_Length):
print('数字を入力してください')
#終了か、再入力かを選択
isFinish = input('再入力しますか? Y/N\n')
if isFinish == 'Y':
Main()
else:
sys.exit
if pass_Length == '':
pass_Length=20
result_password = pass_gen(int(pass_Length))
print(result_password)
#パスワード生成の履歴も一応残しておく
historyTextPath = r"./PasswordHistory.txt"
w = open(historyTextPath,'w')
w.write(str(datetime.datetime.now())+'\t'+result_password)
Main()
パスワード生成の肝はsecretsモジュール。
charsに生成したい文字列の定義を入れ、
join(secrets.choice(chars)
でつなげる。シンプルに生成のみならば次のプログラムで済む。
import string
import secrets
def pass_gen(size=20):
chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
# 記号を含める場合
# chars += '%&$#()'
password = ''.join(secrets.choice(chars) for x in range(size))
if not Check_InWords_Num(password):
pass_gen(size)
exit
return password
次はパスワード生成から管理アプリを作ろうと思う。
その布石としてのパスワード生成履歴なので、履歴がいらなければ、osモジュールもimportする必要はない。