#c# #unity3d
#c# #unity3d
Вопрос:
У меня есть простая игра с прыжками. В этой игре есть вращающиеся платформы и объект игрока.
Всякий раз, когда игрок нажимает кнопку мыши, он должен прыгать и прилипать к следующей платформе и вращаться вместе с ней, пока он не нажмет снова. Я хочу, чтобы игровой объект прыгал перпендикулярно вращающимся платформам.
Если я использую Vector3.up, игровой объект вместо этого упадет. Но я хочу, чтобы игрок прыгнул в направлении зеленой стрелки и придерживался следующей платформы.
Я публикую здесь, потому что я опубликовал в формах Unity 2 недели назад и до сих пор не получил ответа.
TLDR:
вот над чем я недавно работал: мой код проигрывателя :
Rigidbody2D Rig;
public float Force =500;
public bool gamejump = true;
public Transform platformParent;
bool playerforce = false;
bool setpos = false;
Vector2 pos = new Vector2(0, 0);
public Collider2D Ccollider;
public bool bottom =false;
void Start()
{
Rig = GetComponent<Rigidbody2D>();
Ccollider = GetComponent<CircleCollider2D>();
}
private void FixedUpdate()
{
if (gamejump == true)
{
transform.SetParent(null);
Rig.isKinematic = false;
setpos = false;
}
else
{
transform.SetParent(platformParent);
Rig.AddForce(new Vector2(0, 0));
Rig.isKinematic = true;
if (setpos == false)
{
setpos = true;
transform.position = pos;
}
}
}
void OnTriggerStay2D(Collider2D other)
{
if (other.tag == "Rotate")
{
//if (Input.GetKey(KeyCode.Space))
if (Input.GetMouseButton(0))
{
gamejump = true;
if (bottom == true)
{
Rig.AddForce(other.transform.up * Force);
}
else
{
Rig.AddForce(other.transform.up * -Force);
}
}
}
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Rotate")
{
ContactPoint2D contact = collision.contacts[0];
pos = contact.point;
if (collision.contacts.Length>0)
{
bottom = true;
}
else
{
bottom = false;
}
gamejump = false;
}
}
}
и мой код платформы :
public bool counterclockwise;
Transform player;
player2 playerCode;
public Collider2D collidPlatform;
private int speed=100;
// Start is called before the first frame update
void Start()
{
player = GameObject.Find("player").GetComponent<Transform>();
playerCode = FindObjectOfType<player2>();
if (counterclockwise)
speed = -speed;
}
void FixedUpdate()
{
// float currentZ = transform.eulerAngles.z;
/* if (Limit == true)
{
if (currentZ > 180)
{
currentZ = 180;
}
Vector3 newEuler = new Vector3(0, 0, currentZ);
transform.eulerAngles = newEuler;
}
//transform.Rotate(new Vector3(0, 0, speed * Time.deltaTime));
}
*/
}
private void OnCollisionEnter2D(Collision2D collision)
{
playerCode.platformParent = transform;
playerCode.Ccollider = collidPlatform;
}
}
и все равно получаются сумасшедшие результаты, внезапно игрок вращается в воздухе или доза не прилипает к платформе и падает, или когда он прилипает к платформе, это увеличивает скорость платформы (я знаю, что это из-за жесткого тела, которое крепится к платформам, но если я удалю его и попытаюсь управлять им вручную, доза не будет работать так, как я хочу, поэтому, если бы вы могли дать мне предложение о том, как вращать платформы вручную и без жесткого тела, чтобы я мог контролировать скорость.
Комментарии:
1. Пара проблем, которые я вижу только с 5-минутного взгляда: кажется, что ваша игра 2D, но у вас есть несколько мест, в которых вы упомянули 3D-векторы, включая Vector3.up, и вы поддерживаете
Vector3 pos
в своем скрипте. Это первое место, с которого я бы начал, чтобы убедиться, что что-то в 3-м измерении не сбивает вас с толку.2. да, моя игра 2d , в моем новом коде я изменил все на 2D, но у меня все еще есть проблема
Ответ №1:
если вы сделаете игрока дочерним объектом платформы с помощью transform.parent
, а затем прыгнете с помощью transform.up
локальной оси игроков, если вы хотите, чтобы игрок приземлился в том же положении, в котором он прыгнул, игрок может оставаться родительским для вращающейся платформы, в противном случае вам нужно удалить игрока как дочерний объект на платформу после прыжка. Но поскольку вы используете физику твердого тела, я думаю, вы получите смешанные результаты от силы тяжести.
Комментарии:
1. да, я пробовал это, но, как вы упомянули, я получил странные результаты, я также пытался удалить жесткое тело и вращать платформы вручную, для некоторых платформ это работает, но внезапно игрок зависает в воздухе или доза не прилипает к следующей платформе, а просто ударяется о платформу и падает