Вытягивание / толкание трехмерного объекта единства с использованием физики - PullRequest
0 голосов
/ 11 июля 2019

Я делаю трехмерную головоломку-платформер с двумя персонажами. Вы можете переключаться между символами, используя ввод. Я использую физику, чтобы контролировать своих персонажей. Я хочу, чтобы мой единственный персонаж мог толкать и тянуть блоки и по одной оси за раз (ось X или Z). Для головоломки, которую я разрабатываю, я также хочу, чтобы другой персонаж встал на блок, чтобы переместить его на более высокий выступ, но я не могу этого сделать, если объект не кинематический. (что означает, что наземная проверка не выполняется, когда персонаж стоит на жестком теле)

Это также ничего не стоит, что я сделал это так, что персонаж, который прыгает на блок, становится потомком объекта, поэтому он движется вместе с объектом.

Что мне делать?

Я пытался использовать приведенный ниже код из Unity API на жестких телах, прикрепленных к плееру, но все равно не повезло.

Также обеспечивает проверку заземления моего контроллера физики.

public float pushPower = 2.0f;

 void OnCollisionEnter(Collision hit)
 {
     Rigidbody body = hit.collider.attachedRigidbody;
     // no rigidbody
     if (body == null || body.isKinematic)
         return;
     // We dont want to push objects below us
     if (hit.transform.position.y < -0.3f)
         return;
     // Calculate push direction from move direction,
     // we only push objects to the sides never up and down
     Vector3 pushDir = new Vector3(hit.transform.position.x, 0, hit.transform.position.z);
     // If you know how fast your character is trying to move,
     // then you can also multiply the push velocity by that.
     // Apply the push
     body.velocity = pushDir * pushPower;
 }

        public virtual void Jump()
        {
            // conditions to do this action
            bool jumpConditions = isGrounded && !isJumping;
            // return if jumpCondigions is false
            if (!jumpConditions) return;
            // trigger jump behaviour
            jumpCounter = jumpTimer;            
            isJumping = true;
            // trigger jump animations            
            if (_rigidbody.velocity.magnitude < 1)
                animator.CrossFadeInFixedTime("Jump", 0.1f);
            else
                animator.CrossFadeInFixedTime("JumpMove", 0.2f);
        }

Прямо сейчас, используя код, объект ускользает, как только персонаж сталкивается с ним.

...