【问题标题】:Shooting a bullet in front of player C#在玩家 C# 面前射击子弹
【发布时间】:2016-05-08 05:15:41
【问题描述】:

我正在尝试在玩家面前实例化一个“子弹”(脚本附加到的游戏对象)。我试过了(正如我在其他线程中看到的那样),但没有用:

GameObject  bulletobj = Instantiate (bulletFired, transform.position + transform.forward * 2, Quaternion.identity) as GameObject;

问题是子弹有一个总是击中玩家的对撞机,因为在一定的旋转中子弹在玩家身后产生:/,所以我需要在他面前产生它。这是我用来推动它的线条:

var mousePosition = FindObjectOfType<Camera> ().ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.z - FindObjectOfType<Camera> ().transform.position.z));

bulletobj.GetComponent<Rigidbody2D> ().velocity = (mousePosition - transform.position).normalized * bulletSpeed * Time.smoothDeltaTime;

在此先感谢大家:D

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您想使用Physics.IgnoreCollision(实际上请阅读文档以节省您以后的麻烦)来阻止子弹击中发射它的玩家。

    GameObject  bulletobj = Instantiate (bulletFired, transform.position + transform.forward * 2, Quaternion.identity) as GameObject;
    Physics.IgnoreCollision(gameObject.GetComponent<BoxCollider>(),
                            bulletobj.GetComponent<BoxCollider>()));
    

    这假设您将 BoxCollider 附加到两个对象。您必须根据附加的对撞机类型来更改此设置。

    编辑:我觉得我应该补充一下,像这样实例化很多对象是非常低效的。如果您刚刚开始统一,并且只想让某些东西发挥作用,那么请继续这样做。如果您想以正确的方式进行操作,请查看object pooling。这是您在游戏开始时实例化一组子弹,然后一遍又一遍地重复使用它们的地方。这样可以节省不必要的大量内存分配。

    【讨论】:

    • 放置后 - Physics.IgnoreCollision(GetComponent, bulletobj.GetComponent); - 我得到“Argument '#1' cannot convert 'method group' expression to type 'UnityEngine.Collider'”
    • 哎呀,我错了。在两个GetComponents 之后添加括号。现在检查我的答案,我编辑了它
    • 哦,是的,我没看到-_-,很抱歉:D
    • 军队一定会喜欢可重复使用的弹药! :)
    • 这有帮助吗? @Ay0m4
    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    相关资源
    最近更新 更多