我想实例化一个射弹,并能够将其旋转为父级玩家对象的子级。 我的玩家有一个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);
}
}
答案 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对撞机消息。
额外注意事项: OnTriggerEnter
或OnTriggerEnter2D
仅在您将碰撞者设置为Trigger
时执行。通过选择具有任何对撞机的游戏对象,您可以在Inspector中查看此Trigger
。但如果未设置为Trigger
,则应使用OnCollisionEnter2D(Collision2D coll)