【问题标题】:How to instantiate a marker to a sphere object (GLOBE) in unity如何统一将标记实例化为球体对象(GLOBE)
【发布时间】:2019-11-12 07:51:40
【问题描述】:

我是统一的初学者,我想在球体对象上放置一个标记到特定位置(按纬度和经度)。我试过这段代码:

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

public class testPosLatLong : MonoBehaviour {

public float longi;
public float lati;
public float radius;
public Transform marker;

// Use this for initialization
void Start () {
    // longitude and latitude of uae
    longi=23.4241f;
    lati=53.8478f;
    // Transfer to Radians from Degrees
    float templongi = longi * Mathf.PI / 180;
    float templati = lati * Mathf.PI / 180;

    float Xpos = radius * Mathf.Cos(templati) * Mathf.Cos(templongi);
    float Ypos = radius * Mathf.Cos(templati) * Mathf.Sin(templongi);
    float Zpos = radius * Mathf.Sin(templati);

    Debug.Log ("X, Y, Z" + Xpos + " " + Ypos + " " + Zpos);

    // Set the X,Y,Z pos from the long and lat
    Instantiate(marker);
    marker.position = new Vector3 (Xpos, Zpos, Ypos);

    Debug.Log ("Marked  positions: X, Y, Z" + Xpos + " " + Ypos + " " + Zpos);

 }

 // Update is called once per frame
 void Update () {

 }
}

我需要将这个脚本拖到我的球体对象或相机对象吗?或创建任何其他对象并在其上拖动。因为我是 Unity 的初学者,所以我不知道如何在球体上添加标记。

我的球体是一个球体(我在球体中添加了材质(添加了地球图像)并将其制作为球体对象,如屏幕截图所示)。 将上述脚本添加到相机对象后,当我播放并检查控制台时,x、y、z 位置为 0,并且在地球上看不到任何标记

my debug log image

我想在相应的国家/地区添加大头针并标记它。类似于地球上的http://kitsdmcc.com/news

camera object view picture

game object pin view picture

【问题讨论】:

  • 您实例化了球体,但移动了预制件而不是您制作的预制件。你需要做类似 var newmarker = Instantiate(marker) 然后 newmarker.position = ...
  • 还有我应该在哪里附加到相机对象或球体对象的c#脚本,你有示例代码吗,我只是这个统一的初学者。
  • 那是代码
  • @BugFinder 你能帮忙把这个预制件添加到球体吗,我试过你说的,但看不到球体上的物体
  • 使用场景来调试它的第一个位置..检查它的放置位置

标签: c# unity3d


【解决方案1】:

嗨嗨,这看起来是个有趣的项目。

要回答有关将脚本放置在何处的问题 - 您可以将其放置在场景中的任何对象上。 对象加载到场景中后,它们附加的脚本将运行。

但在您的情况下,将脚本放在您的球体对象上可能是有意义的。 通过这样做,您可以轻松引用球体对象,并将标记附加为球体的子对象。

至于标记,我建议实例化一个预制件。 在 Assets 文件夹中创建一个名为“Resources”的文件夹,并在其中放置一个预制件。

然后您可以使用以下代码来实例化预制件。

    //The original object, where to instantiate, and the orientation of the new object
    GameObject marker = (GameObject)Resources.Load("markerobject");
    Vector3 location = new Vector3(20,20,20);
    Quaternion rotation = Quaternion.Euler(0,90,0);

    //The object the script is attached to
    GameObject world = this.gameObject;

    //Instantiate the prefab
    Instantiate(marker, location, rotation, world.transform);

我已经给实例化对象设置了位置和方向,所以请使用上面的代码作为参考并根据需要进行调整。

关于 Instantiate 方法的参数,您可以在此处找到文档 https://docs.unity3d.com/ScriptReference/Object.Instantiate.html

以下是参数的一些细目:

  • 第一个参数(对象):这是您想要的原始对象 实例化。
  • 第二个参数(Vector3):这是 实例化的对象将出现。
  • 第三个参数(四元数):这是实例化对象的方向。
  • 第四个参数(变换):这将是实例化对象的父级。如果你不需要给它一个父级,你可以忽略它。

【讨论】:

  • 我试过这个但我看不到地球(球体)中的大头针这是我的 c# 代码codepile.net/pile/1qYWllXe,这是我拖到球体对象
  • 如果对象被正确实例化,它应该出现在左侧示例场景中的对象列表中。你能检查一下新对象是否存在吗?如果是,它可能已经在 sphere 对象内实例化,因此我们无法实际看到它。在这种情况下,调整 Vector3(20,20,20) 中的数字;代码的一部分,位于您的球体之外的坐标。否则,请检查您的控制台是否有任何错误。
  • 是的,在场景中我可以看到物体。但是我设置了 x=0.35 y0.35 和 z=0.25 但在游戏和游戏屏幕中我看不到球体上的物体@ 987654323@和游戏画面:pasteboard.co/IGshXB2.png
  • 很高兴知道它在某处被实例化:) 在播放模式下,将选项卡从“游戏”切换到“场景”。然后双击左侧列表中的实例化对象。这应该使编辑器缩放并专注于实例化的对象。之后,尝试缩小 - 您可能会发现它是在一个非常远的地方实例化的(原因尚不清楚)。
  • 我尝试了你所说的,但我的实例化对象(蓝色图钉)没有出现在相机上,即使它出现在场景中请在此处查看相机预览:pasteboard.co/IGt3DrS.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多