Платформы у меня триггерные пока куб находиться под ними, но как только куб выше платформы, то они перестают быть триггерными. Добился я это вот этим кодом и сделал прифаб.
Синтаксис:
Используется csharp
public class Platform : MonoBehaviour {
public GameObject cube;
public static float blocky, cubey, cube2y, block2y;
void Start()
{
cube = GameObject.Find("MCube");
}
void FixedUpdate()
{
if (cube != null)
{
blocky = gameObject.transform.position.y + 0.25f;
cubey = cube.transform.position.y - 0.5f;
cube2y = cube.transform.position.y;
block2y = gameObject.transform.position.y;
if (block2y < cube2y && blocky < cubey)
{
gameObject.GetComponent<BoxCollider>().isTrigger = false;
}
if (blocky > cubey && block2y > cube2y)
{
gameObject.GetComponent<BoxCollider>().isTrigger = true;
}
}
}
}
public GameObject cube;
public static float blocky, cubey, cube2y, block2y;
void Start()
{
cube = GameObject.Find("MCube");
}
void FixedUpdate()
{
if (cube != null)
{
blocky = gameObject.transform.position.y + 0.25f;
cubey = cube.transform.position.y - 0.5f;
cube2y = cube.transform.position.y;
block2y = gameObject.transform.position.y;
if (block2y < cube2y && blocky < cubey)
{
gameObject.GetComponent<BoxCollider>().isTrigger = false;
}
if (blocky > cubey && block2y > cube2y)
{
gameObject.GetComponent<BoxCollider>().isTrigger = true;
}
}
}
}
При спавне платформы ей назначается номер от 1 и т.д.
Синтаксис:
Используется csharp
public class SpawnBlock : MonoBehaviour {
public GameObject block, allCubes;
private float r = -1.5f, n = -0.5f;
public static int k = 1;
void Start ()
{
for (int i = 0; i < 5; i++)
{
block = Instantiate(block, new Vector3(Random.Range(-1.9f, 1.8f), Random.Range(r, n), 0f), Quaternion.identity);
block.transform.localScale = new Vector3(RandScale(), block.transform.localScale.y, block.transform.localScale.z);
string number = k.ToString();
block.name = number;
k ++;
r = r + 2;
n = n + 2;
block.transform.parent = allCubes.transform;
}
}
float RandScale ()
{
float rand;
if (Random.Range(0, 100) > 65)
{
rand = Random.Range(1f, 2f);
}
else
{
rand = Random.Range(1f, 1.5f);
}
return rand;
}
}
public GameObject block, allCubes;
private float r = -1.5f, n = -0.5f;
public static int k = 1;
void Start ()
{
for (int i = 0; i < 5; i++)
{
block = Instantiate(block, new Vector3(Random.Range(-1.9f, 1.8f), Random.Range(r, n), 0f), Quaternion.identity);
block.transform.localScale = new Vector3(RandScale(), block.transform.localScale.y, block.transform.localScale.z);
string number = k.ToString();
block.name = number;
k ++;
r = r + 2;
n = n + 2;
block.transform.parent = allCubes.transform;
}
}
float RandScale ()
{
float rand;
if (Random.Range(0, 100) > 65)
{
rand = Random.Range(1f, 2f);
}
else
{
rand = Random.Range(1f, 1.5f);
}
return rand;
}
}
Потом в коде для куба я использую метод OnCollisionEnter и OnCollisionExit для определения на какой платформе находиться куб. При прыжке он запоминает от какой платформы оттолкнулся, а при приземление он запоминает номер платформы на которую приземлился и делает сравнение и если первый номер меньше второго, то он на новой платформе, если равен или больше то это проигрыш.
Синтаксис:
Используется csharp
public class Cube : MonoBehaviour
{
Rigidbody rb;
private float horizontal;
private bool xpos;
public static bool cubey, GG;
private int p;
private int o;
void Start()
{
rb = GetComponent<Rigidbody>();
if (Application.platform == RuntimePlatform.Android)
{
xpos = true;
}
else
{
xpos = false;
}
}
void FixedUpdate()
{
if (xpos && !cubey)
{
horizontal = Input.acceleration.x;
}
if (!xpos && !cubey)
{
horizontal = Input.GetAxis("Horizontal");
rb.velocity = new Vector3(Input.GetAxis("Horizontal") * 5f, rb.velocity.y, rb.velocity.z);
}
if (transform.localPosition.y < -5f)
{
Destroy(gameObject, .1f);
print("GG");
GG = true;
}
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Platform")
{
cubey = true;
if (Jump.sleep && cubey)
{
if (Platform.blocky > Platform.cubey && Platform.block2y > Platform.cube2y)
{
string theName = collision.transform.name;
int.TryParse(theName, out p);
StartCoroutine(pos());
}
}
}
}
void OnCollisionExit(Collision collision)
{
if (collision.gameObject.tag == "Platform")
{
cubey = false;
if (Jump.sleep)
{
string theName = collision.transform.name;
int.TryParse(theName, out o);
}
}
}
IEnumerator pos()
{
yield return new WaitForSeconds(0.25f);
if (o == p || o > p)
{
GG = true;
print("GG");
}
else if (o < p)
{
GG = false;
print("Next");
}
}
}
{
Rigidbody rb;
private float horizontal;
private bool xpos;
public static bool cubey, GG;
private int p;
private int o;
void Start()
{
rb = GetComponent<Rigidbody>();
if (Application.platform == RuntimePlatform.Android)
{
xpos = true;
}
else
{
xpos = false;
}
}
void FixedUpdate()
{
if (xpos && !cubey)
{
horizontal = Input.acceleration.x;
}
if (!xpos && !cubey)
{
horizontal = Input.GetAxis("Horizontal");
rb.velocity = new Vector3(Input.GetAxis("Horizontal") * 5f, rb.velocity.y, rb.velocity.z);
}
if (transform.localPosition.y < -5f)
{
Destroy(gameObject, .1f);
print("GG");
GG = true;
}
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Platform")
{
cubey = true;
if (Jump.sleep && cubey)
{
if (Platform.blocky > Platform.cubey && Platform.block2y > Platform.cube2y)
{
string theName = collision.transform.name;
int.TryParse(theName, out p);
StartCoroutine(pos());
}
}
}
}
void OnCollisionExit(Collision collision)
{
if (collision.gameObject.tag == "Platform")
{
cubey = false;
if (Jump.sleep)
{
string theName = collision.transform.name;
int.TryParse(theName, out o);
}
}
}
IEnumerator pos()
{
yield return new WaitForSeconds(0.25f);
if (o == p || o > p)
{
GG = true;
print("GG");
}
else if (o < p)
{
GG = false;
print("Next");
}
}
}
Проблема в том, что пролетая через платформу он считывает данные, хотя он в полёте и не приземляется на неё. В итоге хоть он и на следующей платформе, но он показывает поражение. Как это исправить? Я не силён в скриптах и unity и это мой первый проект