我有一名球员和一些NPC。 NPC随机运动,我控制着我的球员运动。他们都有RigidBody2D来处理物理,BoxCollider2D来处理碰撞。
但是,当我走进一个NPC时,我的播放器会推动它。如果NPC在玩家静止时移动到我的播放器中也是一样。
我无法将任何一个对象的质量设置为某个极端数字,因为这会干扰他们在游戏中与其他对象的行为方式。
我想要的是什么: 当一个NPC与玩家发生碰撞时,NPC会停止(如果我将玩家质量设置为前1000,我会得到这个效果,但玩家可以推动NPC,我不想要),并且NPC充当&#34墙壁",即它不动,但玩家也不能推动它。我怎么能这样做?
编辑:所以我为它创建了自己的方法:
void OnCollisionEnter2D(Collision2D other){
if (other.gameObject.name == "Player") {
collidedWithPlayer = true; //we only move if !collidedWithPlayer
isMoving = false; //stop moving
myRigidBody.mass = 1000; //turn NPC into "wall"
}
}
void OnCollisionExit2D(Collision2D other){
if (other.gameObject.name == "Player") {
collidedWithPlayer = false;
waitCounter = waitTime; //stop NPC from starting to move right after we exit
myRigidBody.mass = 1;
}
}
我的意思是这有效,但是没有本地方法可以做到这一点吗?
答案 0 :(得分:1)
你要做的是基本上使用"现实"物理引擎创造了相当不切实际的物理学。这就是为什么Unity内置功能不支持它的原因。此外,你认为弄乱对象群体不是一个好主意是正确的。
这里有一个避免玩质量的建议。它有点笨拙,但试一试,看看它是否适合你。 (我假设你的玩家刚性不是动画?)
第1步:创建2个新图层;称他们为NPCWall和PlayerWall。设置2D物理,以便玩家与NPCWall碰撞,NPC与PlayerWall发生碰撞,但玩家不会与NPC发生碰撞。 (如果你的NPC和玩家在同一层,那么当然把它们放在两个不同的层上。)
步骤2:创建一个NPCWall预制件,它使用与NPC相同类型的对撞机。我假设你只有一个尺寸的NPC。同样,创建一个PlayerWall预制件,它使用与玩家相同类型的对撞机。将NPCWall预制件设置为NPCWall层,将PlayerWall预制件设置为PlayerWall层。
步骤3:我们不能将NPCWall归为NPC,因为它最终会成为刚体的一部分。因此,向NPCWall和PlayerWall添加一个简单的脚本:
public class TrackingWall
{
//This invisible wall follows an NPC around to block the player.
//It also follows the player around to block NPCs.
Transform followTransform;
public void Init(Transform targetTrans)
{
followTransform = targetTrans;
transform.position = followTransform.position;
transform.rotation = followTransform.rotation;
}
void Update()
{
if (followTransform == null)
Destroy(gameObject);
transform.position = followTransform.position;
transform.rotation = followTransform.rotation;
}
}
第4步:在NPC和播放器脚本中:
TrackingWall myWallPrefab;
void Start()
{
[whatever else you are doing in Start()]
TrackingWall myWall = Instantiate<TrackingWall>(myWallPrefab);
myWall.Init(transform);
}
显然,对于NPC,myWallPrefab应设置为NPCWall预制件,对于玩家,myWallPrefab应设置为PlayerWall预制件。
理论上,这应该赋予每个角色一个难以穿透的,不可移动的墙壁,只有当它们移动时才会移动,防止其他角色推动它们,并在它们被摧毁时清理它们。我不能保证它会起作用!