我的思路是在玩家周围添加子对象通过子物体上的触发器来判断该位置能否移动。这里就不多就不讲移动方法如何写。
可以按下面步骤进行操做:
首先瓦片地图要挂载上复合碰撞器和瓦片地图碰撞器(并且在制动添加的rigibody2d上的重力设置为0)
还有一点触发器的发生必须两个物体其中一个带有刚体并且碰撞双方都带有碰撞器
挂载到玩家上的周围的子对象都要有碰撞器并且把is trigger可触发勾选上,这里一共有4个, 如图1.2
调整好四个对象位置后大概是这样,这里碰撞器的大小要自己调整我的是0.9如果不调的话碰撞会提前发生。如图1.3
弄好这些配置开始写挂载到这四个对象上的脚本,通过进入触发器触发函数和出触发器触发函数来对结构体中的判断方向是否能移动的变量进行修改。如图下面带码
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public struct Panf
{
public bool up;
public bool down;
public bool right;
public bool left;
}
public class PanPlayerMove : MonoBehaviour
{
private GameObject gb;//当前对象
public static Panf p = new Panf();
private void Start()
{
gb = this.gameObject;
initialize();//结构体初始化
}
private void OnTriggerEnter2D(Collider2D collision)
{
//判读是那个对象触发的
Debug.Log("进入已经被触发");
if (gb.name == "tile_00888 (0)")
{
p.up = false;
}
else if (gb.name == "tile_00888 (1)")
{
p.down = false;
}
else if (gb.name == "tile_00888 (2)")
{
p.right = false;
}
else if (gb.name == "tile_00888 (3)")
{
p.left = false;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
Debug.Log("离开已经被触发");
if (gb.name == "tile_00888 (0)")
{
p.up = true;
}
else if (gb.name == "tile_00888 (1)")
{
p.down = true;
}
else if (gb.name == "tile_00888 (2)")
{
p.right = true;
}
else if (gb.name == "tile_00888 (3)")
{
p.left = true;
}
}
void initialize()
{
p.up = true;
p.down = true ;
p.left = true ;
p.right = true ;
}
}
然后在移动脚本判断上加一个该位置能否移动的的判断就行了,其中p就是结构体实例化对象。如图1.4
如有对本内容不懂可以向我提问。在我看到后会进行回答的。