我正在学习团结,我正在尝试从XNA重新创建一个Unity游戏。
我在youtube上关注此Tutorial Playlist,我使用GameManager和BoardManager创建我的地图。
这是我在墙上预制的检查员
这是我的播放器预制件上的检查员
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
}
}
以下是我的问题游戏的一个例子:
正如您所看到的,玩家可以简单地移入和移出墙壁,就好像他们没有箱式对撞机一样。
在写这篇文章时,我注意到如果我给墙预制件一个Rigidbody2D(假设Is Kinetic
为假),那么就会发生碰撞,但是盒子会移动,这与我的意图相反。当我检查Is Kinetic
时,再没有碰撞。
答案 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:)