概要
kelpnetの作法を調べてみた。
ライントレースやってみる。
運転してみた。
結果
何回やっても、2コーナークリアして、コースアウト。魔物が、住んでる。
サンプルコード
using UnityEngine;
using KelpNet;
using System;
public class pc3 : MonoBehaviour
{
[SerializeField]
private Camera dispCamera;
[SerializeField]
private SpriteRenderer bod;
[SerializeField]
public float val;
private Texture2D tex0;
Function testnn;
void Start()
{
var tex = dispCamera.targetTexture;
tex0 = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false);
testnn = ModelIO.Load(Application.dataPath + "/test.nn");
}
void Update()
{
var tex = dispCamera.targetTexture;
Texture2D tex1 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
Texture2D tex2 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
Texture2D tex3 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
Texture2D tex4 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
Texture2D tex5 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
float v1;
float v2;
float v3;
float v4;
float v5;
RenderTexture.active = dispCamera.targetTexture;
tex0.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
tex0.Apply();
tex1.ReadPixels(new Rect(10, 200, 40, 40), 0, 0);
tex1.Apply();
tex2.ReadPixels(new Rect(60, 200, 40, 40), 0, 0);
tex2.Apply();
tex3.ReadPixels(new Rect(110, 200, 40, 40), 0, 0);
tex3.Apply();
tex4.ReadPixels(new Rect(160, 200, 40, 40), 0, 0);
tex4.Apply();
tex5.ReadPixels(new Rect(210, 200, 40, 40), 0, 0);
tex5.Apply();
val = Sense(tex0);
v1 = Sense(tex1);
v2 = Sense(tex2);
v3 = Sense(tex3);
v4 = Sense(tex4);
v5 = Sense(tex5);
Real[] s = new Real[] {
v1,
v2,
v3,
v4,
v5
};
NdArray res = testnn.Predict(s)[0];
float x = 0;
float y = 0;
if (res.Data[0] > res.Data[1] && res.Data[0] > res.Data[2])
{
y = Time.deltaTime * 0.5f;
}
if (res.Data[1] > res.Data[0] && res.Data[1] > res.Data[2])
{
x = Time.deltaTime * -50.0f;
}
if (res.Data[2] > res.Data[0] && res.Data[2] > res.Data[0])
{
x = Time.deltaTime * 50.0f;
}
transform.Rotate(0, 0, x);
transform.Translate(0, y, 0);
Sprite spr = Sprite.Create(tex0, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f));
bod.sprite = spr;
}
private float Sense(Texture2D tex)
{
var cols = tex.GetPixels();
var avg = new Color(0, 0, 0);
foreach (var col in cols)
{
avg += col;
}
avg /= cols.Length;
return avg.grayscale;
}
}
以上。