所有的身体都有刚体2d和boxcollider2d,并且没有碰撞

时间:2015-12-19 11:41:29

标签: c# unity3d

我正在学习团结,我正在尝试从XNA重新创建一个Unity游戏。

我在youtube上关注此Tutorial Playlist,我使用GameManager和BoardManager创建我的地图。
这是我在墙上预制的检查员 Inspector On Walls
这是我的播放器预制件上的检查员 Inspector On Player

PlayerMovement脚本的代码

using UnityEngine;

namespace Assets.Scripts
{
    public enum Directions
    {
        Back,
        Left,
        Front,
        Right,
        Idle = -1
    }

    public class PlayerMovement : MonoBehaviour 
    {

        #region Public Members

        public float speed;

        #endregion

        #region Constants

        private const float DECAY_FACTOR = 0.85f;
        private const float SPEED_FACTOR = 20000f;

        #endregion

        #region Private Members

        private Rigidbody2D rb2D;
        private Vector2 velocity;
        private Animator animator;

        #endregion

        #region Game Loop Methods

        private void Awake()
        {
            animator = GetComponent<Animator>();
            rb2D = GetComponent<Rigidbody2D>();
        }

        private void Update()
        {
            float vertical = Input.GetAxisRaw("Vertical");
            float horizontal = Input.GetAxisRaw("Horizontal");
            UpdateVelocity(vertical, horizontal);
            UpdateAnimation();
            UpdateMovment();
        }

        #endregion

        #region Animation Methods

        private void UpdateAnimation()
        {
            Directions direction;

            if (velocity.y > 0)
                direction = Directions.Back;
            else if (velocity.y < 0)
                direction = Directions.Front;
            else if (velocity.x > 0)
                direction = Directions.Right;
            else if (velocity.x < 0)
                direction = Directions.Left;
            else
                direction = Directions.Idle;

            SetDirection(direction);
        }

        private void SetDirection(Directions value)
        {
            animator.SetInteger("Direction", (int)value);
        }

        #endregion

        #region Movement Methods

        private void UpdateMovment()
        {
            Debug.Log(string.Format("HOR - {0} : VER - {1} : DIR - {2}", velocity.x, velocity.y, animator.GetInteger("Direction")));
            transform.Translate(velocity.x, velocity.y, 0f, transform);
            ApplySpeedDecay();
        }

        private void UpdateVelocity(float vertical, float horizontal)
        {
            if (vertical != 0)
                velocity.y += Mathf.Abs(speed) / SPEED_FACTOR;
            if (horizontal != 0)
                velocity.x += Mathf.Abs(speed) / SPEED_FACTOR;
        }

        private void ApplySpeedDecay()
        {
            // Apply speed decay
            velocity.x *= DECAY_FACTOR;
            velocity.y *= DECAY_FACTOR;

            // Zerofy tiny velocities
            const float EPSILON = 0.01f;

            if (Mathf.Abs(velocity.x) < EPSILON)
                velocity.x = 0;
            if (Mathf.Abs(velocity.y) < EPSILON)
                velocity.y = 0;
        }

        #endregion
    }
}

以下是我的问题游戏的一个例子:

Ingame photo

正如您所看到的,玩家可以简单地移入和移出墙壁,就好像他们没有箱式对撞机一样。

在写这篇文章时,我注意到如果我给墙预制件一个Rigidbody2D(假设Is Kinetic为假),那么就会发生碰撞,但是盒子会移动,这与我的意图相反。当我检查Is Kinetic时,再没有碰撞。

2 个答案:

答案 0 :(得分:2)

编辑 - 您的播放器已经过“iskinematic”检查!我相信这是你的问题!

通过统一文档“如果isKinematic已启用,则强制,碰撞或关节将不再影响刚体。” - http://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html

1.)确保'wall'有一个Rigidbody2D并检查Rigidbody2D.isKinematic

2.)检查碰撞矩阵。我注意到'玩家'有一层'BlockingLayer'。 (你可能想要改变它)但是如果在Edit-&gt; Project Settings-&gt; Physics2D中,'BlockingLayer'x'BlockingLayer'复选框未选中,那么这将解释没有碰撞。

答案 1 :(得分:0)

解决了 - 玩家不应该是运动学的。 IsKinematic应该是未选中的,Rigidbody2D中的引力应该设置为0.谢谢大家。现在继续下一个碰撞bug:)