【问题标题】:How do I change an object's mass when the player touches it?当玩家触摸一个物体时,我如何改变它的质量?
【发布时间】:2016-09-27 22:29:17
【问题描述】:

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

【问题讨论】:

  • 为什么不直接减少玩家的质量/力量呢?这似乎更准确,并且使您不必调整它们可能推动的所有物体的质量。

标签: c# unity5 unity3d-2dtools


【解决方案1】:

问题实际上是我对附加到播放器的脚本(GrimScript)的引用。碰撞和对质量的引用工作得很好。我将玩家游戏对象设为公共变量,然后访问该变量的组件。

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;
            }
}

}

【讨论】:

    【解决方案2】:

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

    想想《​​塞尔达传说》,当林克走进一个盒子时,他的动画(取决于游戏)要么放慢了速度,要么他只是继续一头扎进盒子里,物体在给定的方向缓慢移动。

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

    --编辑 1--

    重读您的帖子后,我意识到您似乎在沿非常线性的方向移动枪管,在这种情况下,类似塞尔达的方法会更容易。只需更改步行速度,同时更改动画或保持它们不变。我觉得弄乱物理超出了您的编程经验,如果有更简单的方法可以接受它。

    【讨论】:

    • 我没想到只是改变播放器的速度。如果可以的话,我会尝试的。现在我收到的错误是“NullReferenceException:对象引用未设置为对象的实例”我想知道上面的代码是否可以工作,但也许我有语法问题。如果我消除检查 amIRaven 和改变质量的部分,只添加 Destroy(gameObject),它至少会识别碰撞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多