blob: bb0b654ea1c42dd9a8d4832abbd44920a29459dc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
using System.Collections.Generic;
using Landfall.AI;
using UnityEngine;
public class PlayerAIDavid : MonoBehaviour
{
public static int[] topology = new int[4] { 2, 10, 16, 5 };
[SerializeField]
private bool m_useWeights;
[SerializeField]
private WeightDataAsset m_weightData;
private PlayerAPI m_api;
private NeuralNet m_neuralNet;
private double[] m_cachedInput;
private float m_startTime;
private Vector2 m_movement = Vector2.zero;
private float m_aiTimer;
private void Awake()
{
m_api = GetComponentInParent<PlayerAPI>();
m_cachedInput = new double[2];
m_neuralNet = new NeuralNet(topology);
if (m_weightData != null && m_useWeights)
{
m_neuralNet.SetWeights(m_weightData.m_weightDatas[m_weightData.m_weightDatas.Count - 1].m_weights);
}
m_startTime = Time.time + 0.8f;
}
public void SetWeights(double[] weights)
{
m_neuralNet.SetWeights(new List<double>(weights));
}
public void SetWeights(List<double> weights)
{
m_neuralNet.SetWeights(weights);
}
private void Update()
{
if (Time.time < m_startTime)
{
return;
}
if (m_aiTimer >= 0.1f)
{
m_aiTimer -= 0.1f;
Vector3 vector = m_api.OtherPlayerPosition() - m_api.PlayerPosition();
m_cachedInput[0] = vector.x;
m_cachedInput[1] = vector.y;
m_neuralNet.FeedForward(m_cachedInput, 1.0);
double[] results = m_neuralNet.GetResults();
m_api.SetAimDirection(new Vector2((float)results[3], (float)results[4]));
if (results[0] > 0.5)
{
m_api.Jump();
}
if (results[1] > 0.5)
{
m_api.Attack();
}
Vector2 zero = Vector2.zero;
if (results[2] > 0.5)
{
zero.x = 1f;
}
else if (results[2] < -0.5)
{
zero.x = -1f;
}
m_movement = zero;
}
m_api.Move(m_movement);
m_aiTimer += TimeHandler.deltaTime;
}
}
|