UP-Viagg-io/Viagg-io/Assets/Packages/MyBT/BT-Examples/_ManualTick/Scripts/ManualTick.cs

274 lines
9.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using MyBT;
using UnityEngine;
public enum OFFSET_DIR {
forward = 0,
left = 3,
right = 1,
back = 2
}
public class ManualTick : MonoBehaviour
{
[Task]
void AlignDirection () {
// if (Task.isDebugging)
if (Task.isDebugging) Debug.Log("ManualTick.Move "+Task.getState);
if (Task.isStartingOrRunning) {
transform.rotation = Quaternion.Euler(0,0,direction*90);
Task.SetSucceeded();
}
}
[Task]
void Move (int x, int y) {
// if (Task.isDebugging)
if (Task.isDebugging) Debug.Log("ManualTick.Move "+Task.getState);
if (Task.isStartingOrRunning) {
transform.position += new Vector3(x,y,0);
Task.SetSucceeded();
}
}
[Task]
void CheckFree (int x, int y) {
if (Task.isStartingOrRunning) {
Vector3 sourcePos = transform.position;
Vector3 offset = new Vector3(x,y,0);
RaycastHit hitInfo;
if (Physics.SphereCast(sourcePos, 0.4f, offset, out hitInfo, offset.magnitude)) {
if (Task.isDebugging) Debug.Log("ManualTick.CheckFree: t " + hitInfo + " " + sourcePos + " " + offset);
Task.SetFailed();
} else {
if (Task.isDebugging) Debug.Log("ManualTick.CheckFree: f " + hitInfo + " " + sourcePos + " " + offset);
Task.SetSucceeded();
}
}
}
public float updateInterval = 1.0f;
private float accum = 0.0f; // FPS accumulated over the interval
private int frames = 0; // Frames drawn over the interval
private float timeleft = 1.0f; // Left time for current interval
private float fps = 15.0f; // Current FPS
private float lastSample = 0;
private int gotIntervals = 0;
[Task]
void FpsCounter () {
if (Task.isStartingOrRunning) {
++frames;
float newSample = Time.realtimeSinceStartup;
float deltaTime = newSample - lastSample;
lastSample = newSample;
timeleft -= deltaTime;
accum += 1.0f / deltaTime;
// Interval ended - update GUI text and start new interval
if (timeleft <= 0.0f)
{
// display two fractional digits (f2 format)
fps = accum / frames;
timeleft = updateInterval;
accum = 0.0f;
frames = 0;
++gotIntervals;
}
Task.log = "FPS: " + fps.ToString("f2");
// Task.data = Time.time;
// Task.log = $"log {Time.time.ToString()} \n newline";
Task.SetSucceeded();
}
}
[Task]
void DebugLog (string s) {
if (Task.isStartingOrRunning) {
if (Task.isDebugging) {
Debug.Log(s);
}
Task.data = Time.time;
Task.log = $"log {Time.time.ToString()} \n newline";
Task.SetSucceeded();
}
}
public int direction = 2;
static Dictionary<int, Vector2> directions = new Dictionary<int, Vector2>() {
{3, new Vector2(1,0)}, // right?
{2, new Vector2(0,-1)}, // down
{1, new Vector2(-1,0)}, // left
{0, new Vector2(0,1)} // up
};
[Task]
void CheckDirectionFree () {
if (Task.isStartingOrRunning) {
Vector3 sourcePos = transform.position;
Vector3 offset = directions[direction];
RaycastHit hitInfo;
if (Physics.SphereCast(sourcePos, 0.4f, offset, out hitInfo, offset.magnitude)) {
if (Task.isDebugging) Debug.Log("ManualTick.CheckFree: t " + direction+ " " + hitInfo + " " + sourcePos + " " + offset);
Task.SetFailed();
} else {
if (Task.isDebugging) Debug.Log("ManualTick.CheckFree: f " + direction+ " " + hitInfo + " " + sourcePos + " " + offset);
Task.SetSucceeded();
}
}
}
[Task]
void CheckDirectionFree (int forwardOffset, int sideOffset) {
if (Task.isStartingOrRunning) {
if (CheckDirection(forwardOffset, sideOffset)) {
Task.SetFailed();
}
else {
Task.SetSucceeded();
}
}
}
[Task]
void CheckDirectionOccupied (int forwardOffset, int sideOffset) {
if (Task.isStartingOrRunning) {
if (CheckDirection(forwardOffset, sideOffset)) {
Task.SetSucceeded();
}
else {
Task.SetFailed();
}
}
}
bool CheckDirection (int forwardOffset, int sideOffset) {
Vector3 sourcePos = transform.position;
Vector3 forwardOffsetVector = directions[direction] * forwardOffset;
// int sideDirection = (sideOffset>0)?-1:1;
Vector3 sideOffsetVector = directions[((direction-1+4)%4)] * sideOffset;
Vector3 offset = forwardOffsetVector + sideOffsetVector;
// RaycastHit hitInfo;
// Debug.Log($"ManualTick.CheckFree: {direction} source {sourcePos} offset {offset}={forwardOffsetVector}+{sideOffsetVector}");
// hit
// if (Physics.SphereCast(sourcePos+offset, 0.4f, Vector3.zero, out hitInfo, 0)) {
if (Physics.Raycast(sourcePos, offset, offset.magnitude)) {
return true;
}
// no hit
else {
return false;
}
}
[Task]
void CheckDirectionFree (OFFSET_DIR dir_offset) {
if (Task.isStartingOrRunning) {
Vector3 sourcePos = transform.position;
int final_dir = ((direction+(int)dir_offset+4)%4);
Vector3 offset = directions[final_dir];
RaycastHit hitInfo;
if (Physics.SphereCast(sourcePos, 0.4f, offset, out hitInfo, offset.magnitude)) {
if (Task.isDebugging) Debug.Log("ManualTick.CheckFree: t " + offset + " " + direction + " " + dir_offset + "(" + (int)dir_offset + ") " + final_dir + " " + hitInfo + " " + sourcePos + " " + offset);
Task.SetFailed();
} else {
if (Task.isDebugging) Debug.Log("ManualTick.CheckFree: f " + offset + " " + direction + " " + final_dir + " " + hitInfo + " " + sourcePos + " " + offset);
Task.SetSucceeded();
}
}
}
[Task]
void CheckDirectionOccupied (OFFSET_DIR dir_offset) {
if (Task.isStartingOrRunning) {
Vector3 sourcePos = transform.position;
int final_dir = ((direction+(int)dir_offset+4)%4);
Vector3 offset = directions[final_dir];
RaycastHit hitInfo;
if (Physics.SphereCast(sourcePos, 0.4f, offset, out hitInfo, offset.magnitude)) {
if (Task.isDebugging) Debug.Log("ManualTick.CheckFree: t " + offset + " " + direction + " " + dir_offset + "(" + (int)dir_offset + ") " + final_dir + " " + hitInfo + " " + sourcePos + " " + offset);
Task.SetSucceeded();
// Task.SetFailed();
} else {
if (Task.isDebugging) Debug.Log("ManualTick.CheckFree: f " + offset + " " + direction + " " + final_dir + " " + hitInfo + " " + sourcePos + " " + offset);
Task.SetFailed();
}
}
}
[Task]
void TurnRight () {
if (Task.isStartingOrRunning) {
direction = ((direction - 1) + 4) % 4;
TurnCharacter();
if (Task.isDebugging) Debug.Log("ManualTick.TurnRight"+direction);
Task.SetSucceeded();
}
}
[Task]
void TurnLeft () {
if (Task.isStartingOrRunning) {
direction = (direction + 1) % 4;
TurnCharacter();
if (Task.isDebugging) Debug.Log("ManualTick.TurnLeft"+direction);
Task.SetSucceeded();
}
}
[Task]
void TurnRandom () {
if (Task.isDebugging) Debug.Log("ManualTick.TurnRandom "+Task.getState);
if (Task.isStartingOrRunning) {
int randomDirection = (Random.Range(0,2) * 2 - 1);
direction = (direction + 4 + randomDirection) % 4;
TurnCharacter();
if (Task.isDebugging) Debug.Log("ManualTick.TurnRandom: "+randomDirection);
Task.SetSucceeded();
}
}
void TurnCharacter () {
transform.localRotation = Quaternion.Euler(0,0,direction*90);
}
[Task]
void MoveDirection () {
if (Task.isStartingOrRunning) {
if (Task.isDebugging) Debug.Log("ManualTick.MoveDirection "+direction);
Vector3 offset = directions[direction];
transform.position += offset;
Task.SetSucceeded();
}
}
[Task]
void ChanceIn100 (float percentage) {
if (Task.isStartingOrRunning) {
if (Task.isDebugging) Debug.Log("ManualTick.Chance "+direction);
if (percentage > Random.Range(0f, 100f)) {
Task.SetSucceeded();
}
else {
Task.SetFailed();
}
}
}
[Task]
void Fail () {
if (Task.isStartingOrRunning) {
Task.SetFailed();
}
}
}