当玩家触摸它时,如何更改对象的质量?

时间:2016-09-27 22:29:17

标签: c# unity5 unity3d-2dtools

我正在制作一个角色在人与鸟之间切换的游戏。当他是人类时,他可以推动一个桶。当他是一只鸟时,我想增加枪管的质量,这样就更难以推动。我目前在玩家和枪管上都有一个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;
    }
}

2 个答案:

答案 0 :(得分: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;
            }
}

}

答案 1 :(得分:-1)

UE4开发者在这里。如果我要在UE4中完成此任务。我有一个触发器声明,检查玩家是人还是鸟形式,然后根据用户的具体形式,将质量变量设置为给定量,只需改变演员的速度,然后移动该项目慢。

根据塞尔达传说以及当Link进入一个盒子时,他的动画(取决于游戏)要么放慢速度,要么只是继续一步一步地走进盒子,物体在给定的方向上慢慢移动。

有很多变量需要考虑,例如你计划如何移动物品,是否在物理上捡起它,只是将它滑过地板等等。

- 编辑1 -

重读你的帖子后,我意识到你似乎是在一个非常线性的方向上移动一个桶,在这种情况下,类似塞尔达的方法会更容易。只需改变动画的速度,或者改变动画或保持相同。我觉得搞乱物理学是超出你的编程经验,如果有一个更简单的方法来接受它。