如何在Unity中指向2D中特定对象的中心坐标?

时间:2017-10-23 16:44:01

标签: c# unity3d unity5 math-functions

在提问之前,我宣布我是初学者。

请理解可能缺乏解释。

我将用图片和代码解释我想要实现的内容。

下面是一张照片。

enter image description here

如上图所示,我已经实施了目前的导弹(预制),可以在5到7个随机位置之间生成。

以下是代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

class MissileAnimation : WordGameSingleton<MissileAnimation>
{
    private int missile_num = 0; 
    public List<GameObject> missile_list = new List<GameObject>();
    float fixedPosition_z = 1f; 
    public GameObject missile_parent_area = null; 

    protected override void Start()
    {
        StartCoroutine(fireMissiles());

        missile_parent_area = new GameObject();
        missile_parent_area.name = "MissileAnimation"; 
    }

    protected override void Update()
    {
    }

    private IEnumerator fireMissiles()
    {
        yield return new WaitForSeconds(0.3f);


        missile_parent_area.transform.SetParent(this.gameObject.transform);
        missile_parent_area.transform.localScale = new Vector3(1f, 1f, 1f);
        missile_parent_area.transform.localPosition = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y, fixedPosition_z);
        //GameObject planet_position = GameObject.Find("Center_Planet") as GameObject;position.x
        //float planet_position_x = planet_position.transform.position.x;
        //float planet_position_y = planet_position.transform.position.y;

        missile_num = UnityEngine.Random.Range(5, 7); // Generate between 5 and 7EA missiles
        int origin_width = 50;
        int origin_height = 100;

        for (int i = 0; i < missile_num; ++i)
        {
            // Generate missile position random position
            float angle = Mathf.Round(UnityEngine.Random.Range(90f, 180f) + 45f);
            float randomPosition_x = Mathf.Cos(angle) * (Screen.width - origin_width) / 2; 
            float randomPosition_y = Mathf.Sin(angle) * (Screen.height - origin_height) / 2;

            // Center view of the Planet
            // How do I implement this part?

            // Create a missile prefab
            GameObject missile_prefab_load = Resources.Load("Prefabs/Object/Missile") as GameObject;
            GameObject missile_prefab_instantiate = Instantiate(missile_prefab_load, this.gameObject.transform.position, Quaternion.identity) as GameObject;
            //    MonoBehaviour.Instantiate(Resources.Load("Prefabs/Object/Missile"), new Vector3(0f, 0f, 0f), Quaternion.identity) as GameObject;
            missile_prefab_instantiate.name = "missile_" + i;
            missile_prefab_instantiate.transform.SetParent(missile_parent_area.transform);
            missile_prefab_instantiate.transform.localPosition = new Vector3(randomPosition_x, randomPosition_y, 0f);
            missile_prefab_instantiate.transform.localScale = new Vector3(2.0f , 2.0f, 2.0f);
            missile_list.Add(missile_prefab_instantiate);


            // Speed ​​of missile flight
            float speed = UnityEngine.Random.Range(1.0f, 1.4f);

            // Go Missile
            LeanTween.moveLocal(missile_prefab_instantiate, new Vector3(0f, 0f, 0f), speed).setEase(LeanTweenType.easeInCubic).setOnUpdate(crashPlanet).setOnUpdateParam(missile_prefab_instantiate);
            // LeanTween.moveLocal(GameObject , Vector , time:float)
            // setOnUpdate : <float,Object> 

            // Reduced size as the rocket fires.
            LeanTween.scale(missile_prefab_instantiate, new Vector3(1.0f, 1.0f, 1.0f), speed).setEase(LeanTweenType.easeInCubic);
        }
        yield return new WaitForSeconds(0.9f);

        Vector3 position = this.gameObject.transform.localPosition;
        this.transform.position = new Vector3(position.x, 0f, position.z);
    }

    private void crashPlanet(float obj, object missile)
    {

    }
}

我的问题从这里开始。

使用随机坐标创建的导弹对象的Z轴值为零。 (轮换Z)

我希望导弹(预制件)指向Center_Planet的中心坐标。

例如,如下图所示。 enter image description here

为了实现这一点,我使用了LookAT函数,也尝试使用Quaternion.rotation函数。

但实施失败了。

SO ..为了实现上述目的,我们尝试使用Mathf函数进行计算,我不知道如何制定它。

为了实现上述目标,我希望了解如何设置公式的一些建议。

如果你能作为初学者给我建议,我将非常感激。

1 个答案:

答案 0 :(得分:2)

您可以指定&#34;转发&#34;使用transform.right = ....

的2D元素矢量
Transform target = GameObject.Find("Center_Planet").transform ;

// ...

for (int i = 0; i < missile_num; ++i)
{
    // ...     
     missile_prefab_instantiate.transform.right = target.position - missile_prefab_instantiate.transform.position ;
}
yield return new WaitForSeconds(0.9f);

// ...