Фигур пока всего 1, это "Линия" 3 стандартных юнити-куба в ряд + GameObject "Center", который юзается как pivot при поворотах и установлен по центру фигуры(т.к. обычный пивот оказался вообще не там и я не знаю как его переставить).
Код скрипта отвечающего за создание фигур:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class FigureSpawn : MonoBehaviour {
public GameObject[] figures;
private GameObject curFigure;
// Use this for initialization
void Start () {
Spawn();
}
// Update is called once per frame
void Update () {
Spawn();
}
private void Spawn()
{
if(curFigure == null)
{
int val = Random.Range(0,figures.Length);
//curFigure.position = new Vector3(2.25f, 11.5f, 0);
//curFigure = new GameObject(figures[0].name).GetComponent<Transform>();
Vector3 rotate = Vector3.zero;
int ranRotate = Random.Range(0,4);
if(ranRotate == 0 )
{
rotate = new Vector3(0,0,0);
}
else if(ranRotate == 1)
{
rotate = new Vector3(0,0,90);
}
else if(ranRotate == 2)
{
rotate = new Vector3(0,0,180);
}
else if(ranRotate == 3)
{
rotate = new Vector3(0,0,270);
}
curFigure = Instantiate(figures[val], new Vector3(2.5f, 11.5f,0), Quaternion.Euler(rotate)) as GameObject;
}
}
}
using System.Collections;
public class FigureSpawn : MonoBehaviour {
public GameObject[] figures;
private GameObject curFigure;
// Use this for initialization
void Start () {
Spawn();
}
// Update is called once per frame
void Update () {
Spawn();
}
private void Spawn()
{
if(curFigure == null)
{
int val = Random.Range(0,figures.Length);
//curFigure.position = new Vector3(2.25f, 11.5f, 0);
//curFigure = new GameObject(figures[0].name).GetComponent<Transform>();
Vector3 rotate = Vector3.zero;
int ranRotate = Random.Range(0,4);
if(ranRotate == 0 )
{
rotate = new Vector3(0,0,0);
}
else if(ranRotate == 1)
{
rotate = new Vector3(0,0,90);
}
else if(ranRotate == 2)
{
rotate = new Vector3(0,0,180);
}
else if(ranRotate == 3)
{
rotate = new Vector3(0,0,270);
}
curFigure = Instantiate(figures[val], new Vector3(2.5f, 11.5f,0), Quaternion.Euler(rotate)) as GameObject;
}
}
}
figures - массив с префабами фигур(пока 1 линия).
Код отвечающий за саму фигуру(не весь, в целях удобства).
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class LineRayControl : MonoBehaviour {
public Transform center;
private float moveDelay;
private float rotateDelay;
private float fallDelay;
// Use this for initialization
void Start () {
moveDelay = Time.time;
rotateDelay = Time.time;
fallDelay = Time.time;
}
// Update is called once per frame
void Update () {
MoveAndRotate();
if(!CanVerticalMove())
{
Landing();
}
else
{
FallDown();
}
}
#region Update function
private bool CanVerticalMove()
{
if(transform.eulerAngles.z == 0 || transform.eulerAngles.z == 180)
{
if(Physics.Raycast(center.position + new Vector3(0,-1.4f,0), new Vector3(0,-1,0), 0.2f))
{
return false;
}
}
else
{
if(Physics.Raycast(center.position + new Vector3(-1,-0.4f,0), new Vector3(0,-1,0), 0.2f) ||
Physics.Raycast(center.position + new Vector3(0,-0.4f,0), new Vector3(0,-1,0), 0.2f) ||
Physics.Raycast(center.position + new Vector3(1,-0.4f,0), new Vector3(0,-1,0), 0.2f)
)
{
return false;
}
}
return true;
}
private void Landing()
{
Transform[] trfs;
//gravity = Vector3.zero;
trfs = GetComponentsInChildren<Transform>();
foreach(Transform trf in trfs)
{
if(trf.name == "Center")
{
Destroy(trf);
}
else
{
trf.parent = GameObject.Find("CubeBox").GetComponent<Transform>();
}
}
transform.DetachChildren();
Destroy(gameObject);
} private void FallDown()
{
if(Time.time - fallDelay >= 1)
{
fallDelay = Time.time;
transform.position -= new Vector3(0,1,0);
}
}
#endregion
}
using System.Collections;
public class LineRayControl : MonoBehaviour {
public Transform center;
private float moveDelay;
private float rotateDelay;
private float fallDelay;
// Use this for initialization
void Start () {
moveDelay = Time.time;
rotateDelay = Time.time;
fallDelay = Time.time;
}
// Update is called once per frame
void Update () {
MoveAndRotate();
if(!CanVerticalMove())
{
Landing();
}
else
{
FallDown();
}
}
#region Update function
private bool CanVerticalMove()
{
if(transform.eulerAngles.z == 0 || transform.eulerAngles.z == 180)
{
if(Physics.Raycast(center.position + new Vector3(0,-1.4f,0), new Vector3(0,-1,0), 0.2f))
{
return false;
}
}
else
{
if(Physics.Raycast(center.position + new Vector3(-1,-0.4f,0), new Vector3(0,-1,0), 0.2f) ||
Physics.Raycast(center.position + new Vector3(0,-0.4f,0), new Vector3(0,-1,0), 0.2f) ||
Physics.Raycast(center.position + new Vector3(1,-0.4f,0), new Vector3(0,-1,0), 0.2f)
)
{
return false;
}
}
return true;
}
private void Landing()
{
Transform[] trfs;
//gravity = Vector3.zero;
trfs = GetComponentsInChildren<Transform>();
foreach(Transform trf in trfs)
{
if(trf.name == "Center")
{
Destroy(trf);
}
else
{
trf.parent = GameObject.Find("CubeBox").GetComponent<Transform>();
}
}
transform.DetachChildren();
Destroy(gameObject);
} private void FallDown()
{
if(Time.time - fallDelay >= 1)
{
fallDelay = Time.time;
transform.position -= new Vector3(0,1,0);
}
}
#endregion
}
MoveAndRotate() - Проверяет, двигает и вращает фигуру если можно, в зависимости от ввода.
Собсно баг наверняка связан с этими методами:
CanVerticalMove() - проверяет есть ли снизу препятстие.При баге возвращает false(должно true).Соотвественно выполняется
Landing() - производит некоторые действия.
FallDown() - двигает фигуру вниз.
Если баг не проявляется, то все нормально, фигуры ставятся одна на другую.