2016-09-27 61 views
0

我正在制作一款游戏,其中角色在人与鸟之间切换。当他是人类时,他可以推桶。当他是一只鸟时,我想增加枪管的重量,这样就很难推动。我目前在玩家和枪管上都有BoxCollider2D和RigidBody2D。没有触发器设置。当玩家触摸它时,如何改变物体的质量?

这是我在桶上的脚本。

private GrimScript script; 
private Rigidbody2D rb; 
public float normalMass = 10f; 
public float heavyMass = 100f; 

// Use this for initialization 
void Awake() 
{ 
    script = GameObject.FindGameObjectWithTag("Player").GetComponent<GrimScript>(); 
    rb = gameObject.GetComponent<Rigidbody2D>();  
} 

// Update is called once per frame 
void Update() 
{ 

} 

void OnCollisionEnter2D(Collision2D other) 
{ 
    if (other.gameObject.CompareTag("Player") && script.amIRaven) 
    { 
     rb.mass = heavyMass; 
    } 
    else 
    { 
     rb.mass = normalMass; 
    } 
} 
+0

为什么不减少玩家的质量/力量?这看起来更准确,并且不必调整可能推送的所有内容的质量。 – Carcigenicate

回答

-1

UE4开发人员在这里。如果我要在UE4中完成这项任务。 Id有一个触发语句来检查玩家是否是人形或鸟形,然后根据用户的具体形式,将质量变量设置为给定的数量,只需改变角色的速度,这又会移动物品比较慢。

从塞尔达传说的角度来看,当Link走进一个盒子时,他的动画(取决于游戏)要么放慢速度,要么只是继续向对象方向缓慢地移动,

有被考虑,如您计划如何移动的项目,相当多的变量无论您是物理拿起它,只是在地板上滑动等

--edit 1--

在重新阅读您的文章后,我意识到您似乎正在以非常线性的方向移动一个桶,在这种情况下,类似塞尔达的方法会更容易。简单地改变步行速度,同时改变动画或保持相同。如果有更简单的方法来处理某些事物,我觉得像物理杂乱无法超越您的编程经验。

+0

我没想过只是改变玩家的速度。如果可以,我会尽力的。现在我收到的错误是“NullReferenceExeception:对象引用未设置为对象的实例” 我想知道如果我上面的代码可以工作,但也许我有一个语法问题。如果我消除了检查amiraven和改变质量的部分,只需添加Destroy(gameObject),它至少可以识别碰撞。 –

0

问题实际上是我参考了附在播放器上的脚本(GrimScript)。碰撞和大众工作的参考很好。我让玩家gameobject成为一个公共变量,然后访问该变量的组件。

public class BarrelPush : MonoBehaviour { 

public GameObject thePlayer; 
private GrimScript script; 
private Rigidbody2D rb; 
public float normalMass = 10f; 
public float heavyMass = 100f; 

// Use this for initialization 
void Awake() { 
    //script = gameObject.FindGameObjectWithTag("Player").GetComponent<GrimScript>(); 
    script = thePlayer.GetComponent<GrimScript>(); 
    rb = gameObject.GetComponent<Rigidbody2D>(); 

} 

void OnCollisionEnter2D(Collision2D other) { 

    if (other.gameObject.CompareTag("Player") && script.amIRaven) 
    { 
     rb.mass = heavyMass; 
    } else 
    { 
     rb.mass = normalMass; 
      } 
} 

}