144 lines
3.7 KiB
C#
144 lines
3.7 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class Walk3 : MonoBehaviour
|
|
{
|
|
public List<GameObject> legs = new List<GameObject>();
|
|
private List<Vector3> legsInitial = new List<Vector3>();
|
|
|
|
// Use this for initialization
|
|
void Start()
|
|
{
|
|
for (int index = 0; index < legs.Count; ++index)
|
|
{
|
|
legsInitial.Add(legs[index].GetComponent<Leg>().point);
|
|
step2.Add(0);
|
|
step6.Add(false);
|
|
//step3.Add(0);
|
|
//step4.Add(new Vector3(0, 0, 0));
|
|
step5.Add(new Vector3());
|
|
}
|
|
}
|
|
|
|
struct step
|
|
{
|
|
public Vector3 pos;
|
|
public float rotation;
|
|
public float height;
|
|
public bool inAir;
|
|
|
|
public step(Vector3 p, float r, float h, bool i)
|
|
{
|
|
pos = p;
|
|
rotation = r;
|
|
height = 0;
|
|
inAir = i;
|
|
}
|
|
}
|
|
|
|
// 1, 3, 5 -= 3
|
|
|
|
int offset(int i, int offset, int max)
|
|
{
|
|
return i - offset < 0 ? (max - (offset - i)) : i - offset;
|
|
}
|
|
|
|
step[] s = {
|
|
new step(new Vector3(-1, 0, 0), -1, 0, false),
|
|
|
|
new step(new Vector3(0, -2, 0), 0, -2, false),
|
|
|
|
new step(new Vector3(0, 0, 0), 0, 0, false), // rest
|
|
|
|
new step(new Vector3(1, 0, 0), 1, 0, false),
|
|
new step(new Vector3(1, 0, 0), 1, 0, false),
|
|
|
|
new step(new Vector3(0, 0, 0), 0, 0, false), // rest
|
|
|
|
new step(new Vector3(0, 2, 0), 0, 2, false),
|
|
new step(new Vector3(-1, 0, 0), -1, 0, true),
|
|
};
|
|
|
|
public int st = 5;
|
|
public int speed2 = 30;
|
|
int speed = 10;
|
|
|
|
public float walkDirection = 0;
|
|
public float centerRotation = 0;
|
|
|
|
int size = 8;
|
|
|
|
public float walkspeed = 1;
|
|
|
|
private List<float> step2 = new List<float>();
|
|
//private List<float> step3 = new List<float>();
|
|
//private List<Vector3> step4 = new List<Vector3>();
|
|
private List<Vector3> step5 = new List<Vector3>();
|
|
private List<bool> step6 = new List<bool>();
|
|
|
|
// Update is called once per frame
|
|
void FixedUpdate()
|
|
{
|
|
if (speed <= 0)
|
|
{
|
|
if (st >= size - 1)
|
|
st = 0;
|
|
else
|
|
st++;
|
|
|
|
for (int index = 0; index < legs.Count; ++index)
|
|
{
|
|
int t = st;
|
|
if (index == 1 || index == 3 || index == 5)
|
|
{
|
|
t = offset(st, 4, size);
|
|
}
|
|
|
|
if (s[t].inAir == false)
|
|
{
|
|
step2[index] = (centerRotation * s[t].rotation) / speed2;
|
|
|
|
Vector3 t2 = s[t].pos;
|
|
t2.x *= walkspeed;
|
|
// rotate x,y around rotation.
|
|
step5[index] = (Quaternion.Euler(0, walkDirection, 0) * t2) / speed2;
|
|
|
|
step6[index] = true;
|
|
}
|
|
else
|
|
{
|
|
Vector3 t2 = (legsInitial[index] + s[t].pos) - legs[index].GetComponent<Leg>().point;
|
|
step5[index] = t2 / speed2;
|
|
|
|
step6[index] = false;
|
|
}
|
|
}
|
|
|
|
speed = speed2;
|
|
}
|
|
else
|
|
{
|
|
speed--;
|
|
makestep();
|
|
}
|
|
}
|
|
|
|
void makestep()
|
|
{
|
|
for (int index = 0; index < legs.Count; ++index)
|
|
{
|
|
legs[index].GetComponent<Leg>().point += step5[index];
|
|
if (step6[index])
|
|
{
|
|
//legs[index].GetComponent<Leg>().point += step5[index];
|
|
|
|
// rotate x,y around rotation.
|
|
legs[index].GetComponent<Leg>().setWorldPos(
|
|
Quaternion.Euler(0, step2[index], 0) * legs[index].GetComponent<Leg>().getWorldPos()
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|