225 lines
7.0 KiB
C#
225 lines
7.0 KiB
C#
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
|
||
}
|
||
} |