如何将 3D 模型动态添加到地平面
How To Dynamically Add a 3D Model to a Ground Plane
我正在使用 Unity 的地平面功能来放置 3d 动画模型。但是,我现在正在使用 AssetBundle 功能下载这个 3d 模型,需要使用脚本将其放置在地平面舞台下。
然而,当我将它部署到 android 设备上时,它没有显示...
我用的是小米红米3s,支持地平面检测
我已经添加了将资产包下载到 Plane Finder 的脚本
AssetbundleDownloadingScript:
public class AssetLoader : MonoBehaviour
{
public static AssetLoader Instance;
public string url = "myurl";
public int version = 1;
public string AssetName;
//public Text infoText;
public string infoText = "";
AssetBundle bundle;
void Awake()
{
Instance = this;
DownloadAsset();
}
void OnDisable()
{
//AssetBundleManager.Unload(url, version);
}
public void DownloadAsset()
{
// bundle = AssetBundleManager.getAssetBundle (url, version);
// Debug.Log(bundle);
if (!bundle)
StartCoroutine(DownloadAssetBundle());
}
IEnumerator DownloadAssetBundle()
{
yield return StartCoroutine(AssetBundleManager.downloadAssetBundle(url, version));
bundle = AssetBundleManager.getAssetBundle(url, version);
if (bundle != null)
infoText = "Download Success.....";
else
infoText = "Download error please retry";
GameObject santaasset = bundle.LoadAsset("animation_keyframes_increase_v1", typeof(GameObject)) as GameObject;
//here script attached to plane finder,get 1st child of planefinder
var child = gameObject.transform.GetChild(0);
if (santaasset != null)
{
santaasset.transform.transform.Rotate(new Vector3(0, 180, 0));
santaasset.transform.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
santaasset.transform.transform.SetParent(child.transform, false);
}
bundle.Unload(false);
}
public void SetInfoText(string text)
{
//infoText.text = text;
}
void OnGUI()
{
GUILayout.Label("Dummy Label:" + infoText);
}
}
这是我的场景截图:
对我做错了什么有什么建议吗?谢谢
我在你的 AssetbundleDownloadingScript
中注意到你正在创建一个 GameObject santaasset
,但是你从未将对象分配给 new
或现有的游戏对象,甚至 Instantiating
它。您正在分配从 bundle
加载的 Asset
。然而,该资产也从未被分配,因为它只是被加载到内存中,以便 Unity 可以识别它。这就是您遇到的情况,这就是为什么您在游戏中看到该对象,但它没有激活,即使它没有被禁用。
要解决此问题,您必须像这样分配游戏对象或实例化它:
GameObject santaasset = Instantiate(bundle.LoadAsset("animation_keyframes_increase_v1", typeof(GameObject)) as GameObject);
我正在使用 Unity 的地平面功能来放置 3d 动画模型。但是,我现在正在使用 AssetBundle 功能下载这个 3d 模型,需要使用脚本将其放置在地平面舞台下。
然而,当我将它部署到 android 设备上时,它没有显示...
我用的是小米红米3s,支持地平面检测
我已经添加了将资产包下载到 Plane Finder 的脚本
AssetbundleDownloadingScript:
public class AssetLoader : MonoBehaviour
{
public static AssetLoader Instance;
public string url = "myurl";
public int version = 1;
public string AssetName;
//public Text infoText;
public string infoText = "";
AssetBundle bundle;
void Awake()
{
Instance = this;
DownloadAsset();
}
void OnDisable()
{
//AssetBundleManager.Unload(url, version);
}
public void DownloadAsset()
{
// bundle = AssetBundleManager.getAssetBundle (url, version);
// Debug.Log(bundle);
if (!bundle)
StartCoroutine(DownloadAssetBundle());
}
IEnumerator DownloadAssetBundle()
{
yield return StartCoroutine(AssetBundleManager.downloadAssetBundle(url, version));
bundle = AssetBundleManager.getAssetBundle(url, version);
if (bundle != null)
infoText = "Download Success.....";
else
infoText = "Download error please retry";
GameObject santaasset = bundle.LoadAsset("animation_keyframes_increase_v1", typeof(GameObject)) as GameObject;
//here script attached to plane finder,get 1st child of planefinder
var child = gameObject.transform.GetChild(0);
if (santaasset != null)
{
santaasset.transform.transform.Rotate(new Vector3(0, 180, 0));
santaasset.transform.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
santaasset.transform.transform.SetParent(child.transform, false);
}
bundle.Unload(false);
}
public void SetInfoText(string text)
{
//infoText.text = text;
}
void OnGUI()
{
GUILayout.Label("Dummy Label:" + infoText);
}
}
这是我的场景截图:
对我做错了什么有什么建议吗?谢谢
我在你的 AssetbundleDownloadingScript
中注意到你正在创建一个 GameObject santaasset
,但是你从未将对象分配给 new
或现有的游戏对象,甚至 Instantiating
它。您正在分配从 bundle
加载的 Asset
。然而,该资产也从未被分配,因为它只是被加载到内存中,以便 Unity 可以识别它。这就是您遇到的情况,这就是为什么您在游戏中看到该对象,但它没有激活,即使它没有被禁用。
要解决此问题,您必须像这样分配游戏对象或实例化它:GameObject santaasset = Instantiate(bundle.LoadAsset("animation_keyframes_increase_v1", typeof(GameObject)) as GameObject);