面板结构
相机结构
实现方法
使用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);
}
}