Переход перпендикулярно вращающемуся объекту

#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. да, я пробовал это, но, как вы упомянули, я получил странные результаты, я также пытался удалить жесткое тело и вращать платформы вручную, для некоторых платформ это работает, но внезапно игрок зависает в воздухе или доза не прилипает к следующей платформе, а просто ударяется о платформу и падает