Files
tianrunCRM/Assets/CoolapeFrame/Scripts/role/CLUnit.cs

418 lines
9.1 KiB
C#
Raw Normal View History

2020-07-04 14:41:25 +08:00
/*
********************************************************************************
*Copyright(C),coolae.net
*Author: chenbin
*Version: 2.0
*Date: 2017-01-09
*Description:
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
using System.Collections;
using System;
namespace Coolape
{
public abstract class CLUnit : CLBehaviour4Lua
{
public static float SCANRange = 30;
//视野
public int instanceID = 0;
//id
[HideInInspector]
public int type;
//类型
// [HideInInspector]
public int id;
//id
[HideInInspector]
byte[] _lev;
//等级
public int lev {
get {
return NumEx.bio2Int(_lev);
}
set {
_lev = NumEx.int2Bio(value);
}
}
public CLUnit mTarget;
//目标
public CLUnit mAttacker;
//攻击我的对象
// [HideInInspector]
// public SBSliderBar _sliderLifeBar;
//血条
// public SBSliderBar lifeBar {
// get {
// if (_sliderLifeBar == null) {
// createLifeBar();
// }
// return _sliderLifeBar;
// }
// set {
// _sliderLifeBar = value;
// }
// }
// public void createLifeBar()
// {
// try {
// _sliderLifeBar = SBSliderBar.instance(hudAnchor, Vector3.zero);
// } catch (Exception e) {
// Debug.LogError(name + ":" + e.ToString());
// }
// }
// public void hiddenLifeBar()
// {
// if (_sliderLifeBar != null) {
// lifeBar.hide();
// }
// _sliderLifeBar = null;
// }
public bool isDead = false;
//是否死亡
public Transform hudAnchor;
//HUD的锚点
public CLRoleState state = CLRoleState.idel;
//状态
[HideInInspector]
public bool isOffense;
//是否进攻方
public bool isDefense {
get {
return !isOffense;
}
}
public bool isCopyBody = false;
//是否分身
public override void clean()
{
mAttacker = null;
// hiddenLifeBar();
isDead = true;
isCopyBody = false;
CancelInvoke();
StopAllCoroutines();
state = CLRoleState.idel;
base.clean();
}
Collider bc;
public Collider collider { //取得boxcollider
get {
if (bc == null) {
bc = GetComponent<Collider>();
}
return bc;
}
}
public Vector3 size = Vector3.one;
public float minSize {
get {
if (collider == null)
return 0;
Vector3 v3 = size;
// float ret = v3.x < v3.y ? v3.x : (v3.y < v3.z ? v3.y : v3.z);
float ret = v3.x < v3.z ? v3.x : v3.z;
return ret;
}
}
#if UNITY_EDITOR
Matrix4x4 boundsMatrix;
public virtual void OnDrawGizmos()
{
Gizmos.color = Color.blue;
Gizmos.DrawWireCube(transform.position, size);
Gizmos.color = Color.white;
}
#endif
Material _materials;
public Material materials { //Old materials
get {
if (_materials == null) {
_materials = getBodyMat(mbody);
}
return _materials;
}
}
public Transform mbody;
//主体
bool isOutLineMode = false;
public static Hashtable matMap = new Hashtable();
/// <summary>
/// Sets the mat out line.
/// </summary>
public void setMatOutLine()
{
setMatOutLineWithColor(Color.white, ColorEx.getColor(255, 0, 0, 150));
}
/// <summary>
/// Sets the mat ice effect.冰冻效果
/// </summary>
public void setMatIceEffect()
{
// setMatOutLineWithColor (Utl.newColor (0, 255, 255), Utl.newColor (0, 255, 255));
setMatToonWithColor(ColorEx.getColor(0, 255, 255));
}
/// <summary>
/// Sets the mat violent.狂暴效果
/// </summary>
public void setMatViolent()
{
// setMatOutLineWithColor (Color.red, Color.red);
setMatToonWithColor(Color.red);
}
public void setMatOutLineWithColor(Color mainColor, Color outLineColor)
{
if (isOutLineMode)
return;
isOutLineMode = true;
if (materials == null)
return;
Material mat = null;
object obj = matMap [materials.mainTexture.name];
if (obj == null) {
mat = new Material(Shader.Find("Outlined/Silhouetted Diffuse"));
mat.mainTexture = materials.mainTexture;
matMap [materials.mainTexture.name] = mat;
} else {
mat = obj as Material;
}
mat.SetColor("_Color", mainColor);
mat.SetColor("_OutlineColor", outLineColor);
setBodyMat(mbody, mat);
}
public void setMatToonWithColor(Color mainColor)
{
// if (isOutLineMode)
// return;
isOutLineMode = true;
if (materials == null)
return;
Material mat = null;
object obj = matMap [materials.mainTexture.name];
if (obj == null) {
mat = new Material(Shader.Find("Toon/Basic"));
mat.mainTexture = materials.mainTexture;
matMap [materials.mainTexture.name] = mat;
} else {
mat = obj as Material;
}
mat.SetColor("_Color", mainColor);
setBodyMat(mbody, mat);
}
public Material getBodyMat(Transform tr)
{
if (tr == null)
return null;
Renderer rd = tr.GetComponent<Renderer>();
if (rd != null && rd.sharedMaterial != null) {
return rd.sharedMaterial;
} else {
SkinnedMeshRenderer smr = tr.GetComponent<SkinnedMeshRenderer>();
if (smr != null) {
return smr.sharedMaterial;
}
}
Transform trch = null;
for (int i = 0; i < tr.childCount; i++) {
trch = tr.GetChild(i);
rd = trch.GetComponent<Renderer>();
if (rd != null && rd.sharedMaterial != null) {
return rd.sharedMaterial;
} else {
SkinnedMeshRenderer smr = trch.GetComponent<SkinnedMeshRenderer>();
if (smr != null) {
return smr.sharedMaterial;
}
}
}
for (int i = 0; i < tr.childCount; i++) {
Material m = getBodyMat(tr.GetChild(i));
if (m != null)
return m;
}
return null;
}
public void setBodyMat(Transform tr, Material mat)
{
if (tr == null)
return;
Renderer rd = tr.GetComponent<Renderer>();
if (rd != null && rd.sharedMaterial != null &&
rd.sharedMaterial.mainTexture == mat.mainTexture) {
rd.sharedMaterial = mat;
} else {
SkinnedMeshRenderer smr = tr.GetComponent<SkinnedMeshRenderer>();
if (smr != null && smr.sharedMaterial != null && smr.sharedMaterial.mainTexture == mat.mainTexture) {
smr.sharedMaterial = mat;
}
}
for (int i = 0; i < tr.childCount; i++) {
setBodyMat(tr.GetChild(i), mat);
}
}
public void setMatToon()
{
// if (!isOutLineMode)
// return;
isOutLineMode = false;
if (materials != null) {
setBodyMat(mbody, materials);
}
}
public override void pause()
{
isPause = true;
enabled = false;
StopAllCoroutines();
CancelInvoke();
base.pause();
}
public override void regain()
{
isPause = false;
enabled = true;
base.regain();
}
public override void Start()
{
#if UNITY_EDITOR
//因为是通过assetebundle加载的在真机上不需要处理只有在pc上需要重设置shader
// Utl.setBodyMatEdit(mbody);
#endif
base.Start();
}
//==========================================
//=== 伪随机
//==========================================
public float RandomFactor = 0;
public float initRandomFactor()
{
RandomFactor = NumEx.NextInt(0, 1001) / 1000.0f;
return RandomFactor;
}
public int fakeRandom(int min, int max)
{
int diff = (max - min);
int point = Mathf.FloorToInt(diff * RandomFactor);
return min + point;
}
public float RandomFactor2 = 0;
public float initRandomFactor2()
{
RandomFactor2 = NumEx.NextInt(0, 1001) / 1000.0f;
return RandomFactor2;
}
public int fakeRandom2(int min, int max)
{
int diff = (max - min);
int point = Mathf.FloorToInt(diff * RandomFactor2);
return min + point;
}
public float RandomFactor3 = 0;
public float initRandomFactor3()
{
RandomFactor3 = NumEx.NextInt(0, 1001) / 1000.0f;
return RandomFactor3;
}
public int fakeRandom3(int min, int max)
{
int diff = (max - min);
int point = Mathf.FloorToInt(diff * RandomFactor3);
return min + point;
}
//====================================================
//====================================================
public virtual void init(int id, int star, int lev, bool isOffense, object other)
{
this.id = id;
this.lev = lev;
this.isOffense = isOffense;
isDead = false;
// setMatToon ();
instanceID = gameObject.GetInstanceID();
}
public abstract CLUnit doSearchTarget();
public abstract void onBeTarget(CLUnit attacker);
public abstract void onRelaseTarget(CLUnit attacker);
public abstract void doAttack();
public abstract void onHurtHP(int hurt, object skillAttr);
public abstract bool onHurt(int hurt, object skillAttr, CLUnit attacker);
public abstract void onHurtFinish(object skillAttr, CLUnit attacker);
public abstract void onDead();
public abstract void moveTo(Vector3 toPos);
public abstract void moveToTarget(Transform target);
}
public enum CLRoleState
{
// -- 空闲
idel,
// -- 到处走动
walkAround,
// -- 归到队伍位置中
formation,
//等待攻击
waitAttack,
// -- 攻击
attack,
// -- 寻敌
searchTarget,
// --击退
beakBack,
}
}