Unity C#2D实例化并操纵作为玩家孩子的射弹

时间:2016-02-12 02:09:54

标签: c# parent-child unity3d-2dtools

我想实例化一个射弹,并能够将其旋转为父级玩家对象的子级。 我的玩家有一个2DRigidbody和盒子对撞机2D,我的射弹也有2DRigidbody和盒子对撞机2D,所以当我从玩家射击它们时他们会在任何地方反弹玩家,但是当我尝试在其他地方实例化玩家时,玩家要么跳到那个位置或者它们远离玩家,因此我想将它们作为玩家的孩子进行实例化。 我的播放器代码

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

// Calls Variables
public Rigidbody2D lazer;
public float speed = 1.0f;
public float hitpoints = 100;
public float lazerlevel = 1;
Transform ParentPlayer;


// Initalizes variables
void Start () {


}

// Updates once per frame
void Update () {
    var move = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0);
    transform.position += move * speed * Time.deltaTime;
    if (Input.GetButtonUp("Fire1")) {
        //Rigidbody2D instance = Instantiate(lazer, transform.position = new Vector3(0,-5,0), transform.rotation) as Rigidbody2D;
        //Vector3 fwd = transform.TransformDirection(Vector3.down);
        //instance.AddForce(fwd * 20 * lazerlevel);
        GameObject objnewObject = (GameObject)Instantiate(lazer, new Vector3(0, 0, 0), transform.rotation);
        objnewObject.transform.parent = ParentPlayer;
    }

}
}

我的激光代码

using UnityEngine;
using System.Collections;

public class PlayerProjectileDoom : MonoBehaviour {

void ontriggerenter() {
        Destroy(gameObject);
}

void Update () {
    Destroy(gameObject, 2F);
}
}

1 个答案:

答案 0 :(得分:0)

您从未在ParentPlayer脚本中分配Player。并且您希望将实例化对象指定为Player的子对象。因此,实现此目的的可能方法是首先实例化您的对象,将其设置为子对象,然后将转换设置为标识,因为在将其设置为子对象后,其转换将变为相对于父对象。

例如,

void Update () {
    var move = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0);
    transform.position += move * speed * Time.deltaTime;
    if (Input.GetButtonUp("Fire1")) {
        GameObject objnewObject = Instantiate(lazer) as GameObject;
        objnewObject.transform.parent = transform;
        objnewObject.transform.localRotation = Quaternion.identity;
        objnewObject.transform.localPosition = Vector3.zero;
    }
}

第二件事是你的PlayerProjectileDoom脚本。你确实以错误的方式实现了OnTriggerEnter。在实施这些消息时应该小心。

第三件事是你在Destroy方法中调用Update,但是如果你把它放在Start中它会起作用。我建议至少尽可能使用Update,绝对不要用于这类事件。

应该是,

using UnityEngine;
using System.Collections;

public class PlayerProjectileDoom : MonoBehaviour {

    void Start(){
        Destroy(gameObject, 2F);
    }

    // For 3D colliders
    void OnTriggerEnter(Collider coll) {
            Destroy(gameObject);
    }

    // For 2D colliders
    void OnTriggerEnter2D(Collider2D coll) {
            Destroy(gameObject);
    }

    void Update () {

    }

}

所以你正在使用2D对撞机,所以你应该使用2D对撞机消息并移除3D对撞机消息。

额外注意事项: OnTriggerEnterOnTriggerEnter2D仅在您将碰撞者设置为Trigger时执行。通过选择具有任何对撞机的游戏对象,您可以在Inspector中查看此Trigger。但如果未设置为Trigger,则应使用OnCollisionEnter2D(Collision2D coll)