团结多个敌人,光线投射?

时间:2017-08-18 14:30:09

标签: c# unity3d

我有一个这样的剧本从maincamera创建一个光线投射并击中敌人。

void FixedUpdate(){
    if (fire) { 
        fire = false;
        RaycastHit hit;
        if (Physics.Raycast (fpsCam.transform.position, fpsCam.transform.forward, out hit, range)){
            if (Enemy.distance < 80) {
                if (hit.collider.tag == "body") {
                    Debug.Log ("Bullet in the body.");
                    Enemy.bodyshot = true; //Changing other script variable.
                } else if (hit.collider.tag == "head") {
                    Debug.Log ("Bullet in the head.");
                    Enemy.headshot = true; //Changing other script variable.
                }
            }
        }
    }
}

更新中的敌人脚本;

if (headshot) { //headshot variable is static to reach from other script.
            anim.SetTrigger ("isDying");
            speed = 0;
            death = true;
}

if (bodyshot) { //bodyshot variable is static to reach from other script.
    anim.SetTrigger ("isSore");
}

所以,当我射击敌人时,所有敌人都在同一时间死亡。因为这些脚本附加到所有敌人。我需要在不使用静态的情况下更改bodyshot和headshot变量。我该怎么办才能将它们分开?

2 个答案:

答案 0 :(得分:2)

说到光线投射,你只需要附加到空GameObject 的光线投射脚本。它不必附加到您要执行光线投射的每个单独的对象上。

使用Unity EventSystem检测对象的点击次数时,您必须将脚本附加到要检测点击次数的GameObject的唯一时间。

因此,从其他GameObjects中删除此脚本,只需将其附加到一个GameObject。

注意:

如果您想要访问光线刚刚击中的GameObject或对其执行某些操作,GameObject将存储在命中变量中。

RaycastHit hit;...
Destroy(hit.collider.gameObject);

您还可以访问附加到Object hit的脚本:

hit.collider.gameObject.GetComponent<YourComponent>().doSomething();

答案 1 :(得分:0)

您可以先检查以确保对撞机是与对象相连的对撞机之一,然后检查标签的正文位置,而不是检查对撞机的标签是什么。例如:

public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new MainViewModel();
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            var plotView = (PlotView) this.FindName("PlotView");

            plotView.LayoutUpdated += OnLayoutUpdated;
        }

        private void OnLayoutUpdated(object sender, EventArgs e)
        {
            var plotView = (PlotView) this.FindName("PlotView") ;

            if (plotView.Model != null)
            {
                var widthAdjustment = plotView.Model.PlotArea.Width - plotView.Model.PlotArea.Height;

                plotView.Width = plotView.ActualWidth - widthAdjustment;
            }
        }
    }

或者为了简化你可以使coll [0]成为头部,[1]成为身体并忽略检查标签。

编辑:正如程序员所提到的,这不是一种有效的方法,因为你将为每个拥有这个脚本的对象投射光线而你真的只想要投射一条光线。