Files
JJBB/Assets/Project/Script/Obj/Obj/ObjParent.cs
2024-08-23 15:49:34 +08:00

225 lines
7.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using Games.GlobeDefine;
using Games.Scene;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Games.LogicObj
{
public class ObjParent_Init_Data
{
public float m_fX; //坐标X
public float m_fZ; //坐标Z
public float m_fDir; //朝向
public string m_StrName; //Obj的名字
public ObjParent_Init_Data()
{
CleanUp();
}
public virtual void CleanUp()
{
m_fX = 0.0f;
m_fZ = 0.0f;
m_fDir = 0.0f;
m_StrName = string.Empty;
}
}
public class ObjParent : MonoBehaviour
{
protected const string shadowObjName = "Shadow";
public static T Create<T>(ObjParent_Init_Data initData, string resPath, GameObject cloneObj = null) where T : ObjParent
{
T result = null;
var modelName = "gameObj";
if (initData != null)
{
var data = initData as Obj_Init_Data;
if (data != null && data.m_ServerID > 0)
modelName = data.m_ServerID.ToString();
else
modelName = initData.m_StrName;
}
var modelObj = cloneObj == null ? ResourceManager.InstantiateResource(resPath, modelName): Instantiate(cloneObj);
if (modelObj != null)
{
modelObj.name = modelName;
result = modelObj.EnsureComponent<T>();
result.Init(initData);
}
return result;
}
protected GameDefine_Globe.OBJ_TYPE m_ObjType; //Obj类型
public GameDefine_Globe.OBJ_TYPE ObjType
{
get { return m_ObjType; }
}
// 头顶信息板高度调整
protected float m_DeltaHeight;
public virtual float DeltaHeight
{
get { return m_DeltaHeight; }
}
protected virtual void Awake()
{
m_ObjTransform = transform;
}
public virtual void DestroyObj()
{
if (HeadUi != null)
{
HeadUi.OnObjDestroy(this);
HeadUi = null;
}
//var objGameObject = gameObject;
//ResourceManager.DestroyResource(ref objGameObject);
Destroy(gameObject);
}
//////////////////////////////////////////////////////////////////////////
//常用基础方法属性接口
//////////////////////////////////////////////////////////////////////////
//缓存Transform提高运行效率,必须在Awake的时候就进行赋值
// 注实际Unity5开始transform等常用属性都会自动缓存因此已无意义
protected Transform m_ObjTransform;
public Transform ObjTransform
{
get { return m_ObjTransform; }
}
public Vector3 Position
{
get { return m_ObjTransform.localPosition; }
set { m_ObjTransform.localPosition = value; }
}
public Obj_HeadUI HeadUi { get; protected set; }
public Quaternion Rotation
{
get { return m_ObjTransform.localRotation; }
set { m_ObjTransform.localRotation = value; }
}
public Vector3 Scale
{
get { return m_ObjTransform.localScale; }
set { m_ObjTransform.localScale = value; }
}
public virtual bool Init(ObjParent_Init_Data initData)
{
if (null == ObjTransform)
m_ObjTransform = transform;
gameObject.SetActive(true);
SyncSetPos(new Vector2(initData.m_fX, initData.m_fZ));
FaceToDir(initData.m_fDir);
return true;
}
/// <summary>
/// 直接设置角色当前服务器位置
/// </summary>
/// <param name="position">服务器上所在位置</param>
public virtual void SyncSetPos(Vector2 position)
{
var clientPosition = ActiveScene.GetTerrainPosition(position.InsertY(Position.y));
m_ObjTransform.position = clientPosition;
}
public virtual void FaceTo(Vector3 facePos)
{
Vector3 lookRot = facePos - m_ObjTransform.position;
lookRot.y = 0;
if (lookRot != Vector3.zero)
m_ObjTransform.rotation = Quaternion.LookRotation(lookRot);
}
//朝向屏幕
public void FaceToScreen()
{
gameObject.transform.Rotate(new Vector3(0, 145, 0));
}
public void FaceToDir(float dir)
{
m_ObjTransform.rotation = GCGame.Utils.DirServerToClient(dir);
}
public void SetScale(float fScale)
{
m_ObjTransform.localScale = Vector3.one * fScale;
}
//判断物体是否在自己前方
public bool IsInFront(Obj targetObj)
{
var result = false;
if (targetObj != null)
{
var forward = ObjTransform.forward;
var offset = targetObj.ObjTransform.position - ObjTransform.position;
// 移除y轴的影响
forward.y = 0f;
offset.y = 0f;
result = Vector3.Dot(forward, offset) > 0f;
}
return result;
}
protected bool m_bVisible = true;
public virtual void SetVisible(bool bVisible)
{
if (bVisible != m_bVisible)
{
m_bVisible = bVisible;
var childCount = transform.childCount;
for (var i = 0; i < childCount; i++)
{
var childObj = transform.GetChild(i).gameObject;
if (string.Equals(childObj.name, shadowObjName, StringComparison.InvariantCulture))
childObj.SetActive(m_bVisible && !UseRealtimeShadow());
else
childObj.SetActive(m_bVisible);
}
}
}
protected virtual bool UseRealtimeShadow()
{
return false;
}
public bool IsVisibleChar() { return m_bVisible; }
#region
public void CreateNameBoard()
{
if(WorldUIRoot.Instance!=null)
WorldUIRoot.Instance.LoadHeadUi(this);
}
// 暂时无法确定这个类是否应该是一个虚构类型,所以不能做虚构
// 现在看到所有headInfo都由其子类构造但是被关联的类型是这个类
public virtual UIPathData HeadUiPath
{
get { return null; }
}
public void BindHeadUi(WorldUIItem worldUiItem)
{
HeadUi = (Obj_HeadUI)worldUiItem;
InitNameBoard(HeadUi);
}
public virtual void InitNameBoard(Obj_HeadUI headUiItem)
{
headUiItem.Init(this);
}
#endregion
}
}