Unity 物品模型旋转展示

面板结构

相机结构

实现方法

使用RawImage显示RenderTexture,RenderTexture的图像来源为物品细节摄像机。

将物品生成在指定的位置上,然后用一个控制器让其自动旋转,再用聚光灯打光,就完成了。

效果

Unity 背包系统

代码

物品细节面板

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

public class ItemDetailPanel : BasePanel
{
    static readonly string path = "Prefabs/UI/ItemDetailPanel";

    Item itemToDisplayed;
    public ItemDetailPanel(Item item) : base(new PanelType(path))
    {
        itemToDisplayed = item;
    }

    Transform itemPosition;
    public override void OnEnter()
    {
        SetViewPosition();

        itemPosition = GameObject.Find("ItemPosition").transform;

        panelBindingTool.GetOrAddComponentInChildren<Button>("关闭").onClick.AddListener(() =>
        {
            panelStack.Pop();
        }
        );

        DisplayItemDetail(itemToDisplayed);
        DisplayItemBeief(itemToDisplayed);

        OrbitCamera.Instance.work = false;
    }

    RawImage display;
    void SetViewPosition()
    {
        display = panelBindingTool.GetOrAddComponentInChildren<RawImage>("Display");
        if (itemToDisplayed.id / 100 - 1 == 0)
            display.texture = Resources.Load<Texture>("Texture/ItemDetail/ItemDetail Horizontal");
        else
            display.texture = Resources.Load<Texture>("Texture/ItemDetail/ItemDetail Up View");
    }

    public override void OnExit()
    {
        GameObject.Destroy(DetailViewController.Instance.modelDisplayed);
        panelManager.DestroyPanel(this.panelType);

        OrbitCamera.Instance.work = true;
    }

    public override void OnPause()
    {
        panelBindingTool.GetOrAddComponent<CanvasGroup>().blocksRaycasts = false;
    }

    public override void OnResume()
    {
        panelBindingTool.GetOrAddComponent<CanvasGroup>().blocksRaycasts = true;
    }

    public void DisplayItemDetail(Item item)
    {
        DetailViewController.Instance.modelDisplayed = GameObject.Instantiate(item.model, itemPosition);
    }

    public void DisplayItemBeief(Item item)
    {
        panelBindingTool.GetOrAddComponentInChildren<Text>("Item Name").text = item.name;
        panelBindingTool.GetOrAddComponentInChildren<Text>("Item Description").text = item.description;
        panelBindingTool.GetOrAddComponentInChildren<Image>("Item Image").sprite = Sprite.Create(item.icon, new Rect(0, 0, item.icon.width, item.icon.height), new Vector2(0.5f, 0.5f));
    }
}

模型旋转控制器

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

public class DetailViewController : MonoSingleton<DetailViewController>
{
    public GameObject modelDisplayed;

    // Update is called once per frame
    void Update()
    {
        if(modelDisplayed)
            AutoRotate();
    }

    public float rotateSpeed = 5;
    void AutoRotate()
    {
        modelDisplayed.transform.localEulerAngles += new Vector3(0, rotateSpeed * Time.deltaTime, 0);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43673589/article/details/124652202