Commit 9eb0b10d authored by 15박보승's avatar 15박보승

Enemy eyesight implemented. Agent's movement improved (Auto rotation implemented).

parent 7d1e5e5f
This diff is collapsed.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BS;
public class Actor : MonoBehaviour
{
protected NodalPathfinding2DAgent agent = null;
[SerializeField]
private int _maxHealth;
public virtual int MaxHealth
{
get
{
return _maxHealth;
}
set
{
float healthRate = (float)Health / _maxHealth;
_maxHealth = value;
Health = Mathf.CeilToInt(Health * healthRate);
}
}
[SerializeField]
private int _health;
public virtual int Health {
get
{
return _health;
}
set
{
_health = value;
}
}
protected virtual void Start()
{
agent = GetComponent<NodalPathfinding2DAgent>();
}
}
fileFormatVersion: 2
guid: 8c4b2be3c2bcea84d9b7d53a1f295a7e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : Actor
{
private MeshRenderer mr = null;
private MeshFilter mf = null;
private Mesh eyesightMesh;
public float eyesightRange = 5f;
[Range(0, 360)]
public int eyesightDegree = 60;
[SerializeField]
private LayerMask blockEyesightMask;
protected override void Start()
{
base.Start();
mr = GetComponentInChildren<MeshRenderer>();
mf = GetComponentInChildren<MeshFilter>();
eyesightMesh = new Mesh();
mf.mesh = eyesightMesh;
}
private void Update()
{
UpdateEyesightMesh();
}
private void UpdateEyesightMesh()
{
List<Vector3> vertices = new List<Vector3>();
List<int> indices = new List<int>();
vertices.Add(Vector3.zero);
for (int i = -eyesightDegree / 2; i <= eyesightDegree / 2; i++)
{
RaycastHit2D hit = Physics2D.Raycast(transform.position, Quaternion.Euler(0, 0, i) * transform.up, eyesightRange, blockEyesightMask);
if (hit.collider == null)
vertices.Add((Quaternion.Euler(0, 0, i) * Vector3.up) * eyesightRange);
else
{
Quaternion quat = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, -transform.rotation.eulerAngles.z);
vertices.Add(quat * (hit.point - new Vector2(transform.position.x, transform.position.y)));
}
}
for (int i = 0; i < vertices.Count - 2; i++)
{
indices.Add(0);
indices.Add(i + 2);
indices.Add(i + 1);
}
eyesightMesh.SetVertices(vertices);
eyesightMesh.SetTriangles(indices, 0);
}
}
fileFormatVersion: 2
guid: fe9408941e58b6748be00d959e3dffa3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
...@@ -223,7 +223,8 @@ namespace BS ...@@ -223,7 +223,8 @@ namespace BS
break; break;
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(2,0) * k)) if (nodes.ContainsKey(node.gridPosition + new Vector2Int(2,0) * k))
{ {
adj.Add(node.gridPosition + new Vector2Int(2, 0) * k); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(2, 0) * k].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(2, 0) * k);
break; break;
} }
} }
...@@ -233,7 +234,8 @@ namespace BS ...@@ -233,7 +234,8 @@ namespace BS
break; break;
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-2, 0) * k)) if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-2, 0) * k))
{ {
adj.Add(node.gridPosition + new Vector2Int(-2, 0) * k); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(-2, 0) * k].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(-2, 0) * k);
break; break;
} }
} }
...@@ -243,7 +245,8 @@ namespace BS ...@@ -243,7 +245,8 @@ namespace BS
break; break;
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(0, 2) * k)) if (nodes.ContainsKey(node.gridPosition + new Vector2Int(0, 2) * k))
{ {
adj.Add(node.gridPosition + new Vector2Int(0, 2) * k); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(0, 2) * k].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(0, 2) * k);
break; break;
} }
} }
...@@ -253,7 +256,8 @@ namespace BS ...@@ -253,7 +256,8 @@ namespace BS
break; break;
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(0, -2) * k)) if (nodes.ContainsKey(node.gridPosition + new Vector2Int(0, -2) * k))
{ {
adj.Add(node.gridPosition + new Vector2Int(0, -2) * k); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(0, -2) * k].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(0, -2) * k);
break; break;
} }
} }
...@@ -266,7 +270,8 @@ namespace BS ...@@ -266,7 +270,8 @@ namespace BS
break; break;
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-1, 1) * k)) if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-1, 1) * k))
{ {
adj.Add(node.gridPosition + new Vector2Int(-1, 1) * k); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(-1, 1) * k].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(-1, 1) * k);
break; break;
} }
} }
...@@ -278,7 +283,8 @@ namespace BS ...@@ -278,7 +283,8 @@ namespace BS
break; break;
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(1, 1) * k)) if (nodes.ContainsKey(node.gridPosition + new Vector2Int(1, 1) * k))
{ {
adj.Add(node.gridPosition + new Vector2Int(1, 1) * k); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(1, 1) * k].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(1, 1) * k);
break; break;
} }
} }
...@@ -290,7 +296,8 @@ namespace BS ...@@ -290,7 +296,8 @@ namespace BS
break; break;
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-1, -1) * k)) if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-1, -1) * k))
{ {
adj.Add(node.gridPosition + new Vector2Int(-1, -1) * k); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(-1, -1) * k].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(-1, -1) * k);
break; break;
} }
} }
...@@ -302,7 +309,8 @@ namespace BS ...@@ -302,7 +309,8 @@ namespace BS
break; break;
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(1, -1) * k)) if (nodes.ContainsKey(node.gridPosition + new Vector2Int(1, -1) * k))
{ {
adj.Add(node.gridPosition + new Vector2Int(1, -1) * k); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(1, -1) * k].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(1, -1) * k);
break; break;
} }
} }
...@@ -323,36 +331,44 @@ namespace BS ...@@ -323,36 +331,44 @@ namespace BS
Node node = nodes[pos]; Node node = nodes[pos];
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(2, 0))) //Right if (nodes.ContainsKey(node.gridPosition + new Vector2Int(2, 0))) //Right
{ {
adj.Add(node.gridPosition + new Vector2Int(2, 0)); if(!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(2, 0)].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(2, 0));
} }
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-2, 0))) //Left if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-2, 0))) //Left
{ {
adj.Add(node.gridPosition + new Vector2Int(-2, 0)); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(-2, 0)].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(-2, 0));
} }
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(0, 2))) // Up if (nodes.ContainsKey(node.gridPosition + new Vector2Int(0, 2))) // Up
{ {
adj.Add(node.gridPosition + new Vector2Int(0, 2)); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(0, 2)].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(0, 2));
} }
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(0, -2))) // Down if (nodes.ContainsKey(node.gridPosition + new Vector2Int(0, -2))) // Down
{ {
adj.Add(node.gridPosition + new Vector2Int(0, -2)); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(0, -2)].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(0, -2));
} }
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-1, 1))) //UpLeft if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-1, 1))) //UpLeft
{ {
adj.Add(node.gridPosition + new Vector2Int(-1, 1)); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(-1, 1)].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(-1, 1));
} }
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(1, 1))) //UpRight if (nodes.ContainsKey(node.gridPosition + new Vector2Int(1, 1))) //UpRight
{ {
adj.Add(node.gridPosition + new Vector2Int(1, 1)); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(1, 1)].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(1, 1));
} }
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-1, -1))) //DownLeft if (nodes.ContainsKey(node.gridPosition + new Vector2Int(-1, -1))) //DownLeft
{ {
adj.Add(node.gridPosition + new Vector2Int(-1, -1)); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(-1, -1)].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(-1, -1));
} }
if (nodes.ContainsKey(node.gridPosition + new Vector2Int(1, -1))) //DownRight if (nodes.ContainsKey(node.gridPosition + new Vector2Int(1, -1))) //DownRight
{ {
adj.Add(node.gridPosition + new Vector2Int(1, -1)); if (!Physics2D.Linecast(nodes[node.gridPosition].worldPositon, nodes[node.gridPosition + new Vector2Int(1, -1)].worldPositon, blockMask))
adj.Add(node.gridPosition + new Vector2Int(1, -1));
} }
node.adjacencies = adj; node.adjacencies = adj;
nodes[pos] = node; nodes[pos] = node;
......
...@@ -107,9 +107,12 @@ namespace BS { ...@@ -107,9 +107,12 @@ namespace BS {
} }
else if (Vector2.Distance(transform.position, destination) < 0.05f) else if (Vector2.Distance(transform.position, destination) < 0.05f)
{ {
rb.velocity = Vector3.zero;
path.RemoveAt(0); path.RemoveAt(0);
} }
} }
if (rb.velocity.magnitude > 0.01f)
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.FromToRotation(Vector3.up, rb.velocity), 0.05f);
} }
} }
} }
\ No newline at end of file
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
public class Noise : MonoBehaviour
{
private LineRenderer lr = null;
private float radius = 0;
[SerializeField]
private float spreadSpeed = 5;
[SerializeField]
private LayerMask blockMask;
private void Start()
{
lr = GetComponent<LineRenderer>();
}
private void Update()
{
radius += spreadSpeed * Time.deltaTime;
for (int i = 0; i < 360; i++)
{
foreach (var hit in Physics2D.LinecastAll(transform.position, (transform.position + Quaternion.Euler(0, 0, i) * new Vector3(radius, 0, 0))))
{
NoiseProtectionObstacle obstacle = hit.collider.GetComponent<NoiseProtectionObstacle>();
if (obstacle == null)
continue;
obstacle.GetNoiseProtection(hit.fraction);
}
}
}
}
fileFormatVersion: 2
guid: 8332481a9e8d53d46b99f1bbdfee8b2d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 5fc714afd0e054c4fbcb7d8e9957d5e8
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
public class NoiseObject : MonoBehaviour
{
private LineRenderer lr = null;
private float radius = 0;
[SerializeField]
private float spreadSpeed = 5;
[SerializeField]
private LayerMask blockMask;
private void Start()
{
lr = GetComponent<LineRenderer>();
}
private void Update()
{
radius += spreadSpeed * Time.deltaTime;
for (int i = 0; i < 360; i++)
{
foreach (var hit in Physics2D.LinecastAll(transform.position, (transform.position + Quaternion.Euler(0, 0, i) * new Vector3(radius, 0, 0))))
{
}
}
}
}
fileFormatVersion: 2
guid: df3d386b4afb2b049bbb9a6b355646a1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Collider2D))]
public class NoiseProtectionObstacle : MonoBehaviour
{
[SerializeField]
private float noiseProtectionRate = 1.0f;
public float GetNoiseProtection(float fraction)
{
return fraction * noiseProtectionRate;
}
}
fileFormatVersion: 2
guid: 4c47b53a481aa0e4cb68164e83f088a6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BS;
enum CharacterControlMode
{
DEFAULT,
AIMING,
}
[RequireComponent(typeof(NodalPathfinding2DAgent))]
public abstract class PlayableCharacter : MonoBehaviour
{
private NodalPathfinding2DAgent agent;
protected virtual void Start()
{
agent = GetComponent<NodalPathfinding2DAgent>();
}
protected abstract void DefaultControl();
protected abstract void AimingControl();
}
fileFormatVersion: 2
guid: e3b92ee9b4c157445aebd3c5f6e5f820
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment