public ObjectColliderBase CreateColliderByType(eColliderType type) { ObjectColliderBase collider = null; switch (type) { case eColliderType.Circle: collider = new ColliderCircle(); break; case eColliderType.Rect: collider = new ColliderRect(); break; case eColliderType.ItalicRect: collider = new ColliderItalicRect(); break; default: Logger.LogError("Collider Type " + type + " is not exist!"); break; } _colliderList.Add(collider); _colliderCount++; return(collider); }
List <MyDrawRect> colliderDrawRect = new List <MyDrawRect>(); // 相交产生的矩形 void ColliderChange() { for (int i = 0; i < colliderRect.Count; i++) { ColliderRect cInfo = colliderRect[i]; MyDrawRect rect; if (i < colliderDrawRect.Count) { rect = colliderDrawRect[i]; } else { rect = GetFreeDrawRectObj(); colliderDrawRect.Add(rect); } rect.transform.parent = colliderParent.transform; rect.transform.SetAsLastSibling(); rect.transform.localPosition = Vector3.zero; rect.transform.localScale = Vector3.one; rect.SetRect(cInfo.size, cInfo.position); DrawTileRect(cInfo.tile1); DrawTileRect(cInfo.tile2); } for (int i = colliderRect.Count; i < colliderDrawRect.Count; i++) { RecycleDrawRectObj(colliderDrawRect[i]); } // DrawColliderTile(); }
// 判断是否有矩形重叠 void CheckSomeTileOverlapping(List <ColliderRect> colliderRect) { colliderRect.Clear(); colliderTileList.Clear(); // 当前点击的矩形的左上角坐标 左下角0,0坐标系y+矩形位置的/2+矩形大小的一半 float curX1 = allTiles[selindex].realPos.x - allTiles[selindex].size.x / 2; float curY1 = allTiles[selindex].realPos.y - allTiles[selindex].size.y / 2 + allTiles[selindex].show_size.y; // 当前点击的矩形的右下角坐标 float curX2 = allTiles[selindex].realPos.x + allTiles[selindex].size.x / 2; float curY2 = allTiles[selindex].realPos.y - allTiles[selindex].size.y / 2; // Debug.Log($"curX1===curY1=----{(curX1, curY1)}"); // Debug.Log($"curX2===curY2=----{(curX2, curY2)}"); for (int i = 0; i < allTiles.Count; i++) { if (allTiles[i].id != allTiles[selindex].id) { float x1 = allTiles[i].realPos.x - allTiles[i].size.x / 2; // 矩形左上角的x坐标 float y1 = allTiles[i].realPos.y - allTiles[i].size.y / 2 + allTiles[i].show_size.y; // 矩形左上角的y坐标 float x2 = allTiles[i].realPos.x + allTiles[i].size.x / 2; // 矩形右下角的x坐标 float y2 = allTiles[i].realPos.y - allTiles[i].size.y / 2; //矩形右下角的y坐标 float StartX = Math.Min(x1, curX1); float EndX = Math.Max(x2, curX2); float StartY = Math.Max(y1, curY1); float EndY = Math.Min(y2, curY2); float CurWidth = (x2 - x1) + (curX2 - curX1) - (EndX - StartX); // 宽度 float CurHeight = (y1 - y2) + (curY1 - curY2) - (StartY - EndY); // 高度 if (CurWidth <= 0 || CurHeight <= 0) { // Debug.Log(" ------没有相交--------------- "); } else { // Debug.Log(" ------相交--------------- "); float tempX = Math.Max(x1, curX1); // 有相交则相交区域位置为:小中取大为左上角,大中取小为右下角 float tempY = Math.Min(y1, curY1); Vector2 curPos = FloorPointChange(new Vector2(tempX, tempY)); ColliderRect rect = new ColliderRect(); rect.position = curPos; rect.size = new Vector2(CurWidth, CurHeight); rect.tile1 = allTiles[selindex]; rect.tile2 = allTiles[i]; colliderRect.Add(rect); colliderTileList.Add(allTiles[i]); colliderTileList.Add(allTiles[selindex]); } } } }
public override void Clear() { _effect = null; _movementObjectTfList.Clear(); _movementDataList.Clear(); GameObject.Destroy(_masterSparkObject); _masterSparkObject = null; _masterSparkTf = null; _sparkContainerTf = null; _movementBodyTf = null; _movementCount = 0; _colliderRect = null; }
public void ClearColliderRectIgnoreTile(BlockTile tile) { for (int i = 0; i < colliderRect.Count; i++) { ColliderRect cInfo = colliderRect[i]; if (tile != cInfo.tile1) { RecycleTileRectByTile(cInfo.tile1); } if (tile != cInfo.tile2) { RecycleTileRectByTile(cInfo.tile2); } } }
/// <summary> /// 魔炮张开的阶段 /// </summary> public void UpdateState1() { _curScaleX = MathUtil.GetEaseInQuadInterpolation(0, 1, _time, _duration); _sparkContainerTf.localScale = new Vector3(_curScaleX, 1, 1); if (_time >= _duration) { _curState = 2; _nextMovementIndex = 0; _time = 0; // 设置碰撞 _colliderRect = ColliderManager.GetInstance().CreateColliderByType(eColliderType.Rect) as ColliderRect; _colliderRect.SetSize(MasterSparkHitBoxWidth, MasterSpartHitBoxHeight); _colliderRect.SetColliderGroup(eColliderGroup.EnemyBullet | eColliderGroup.Enemy | eColliderGroup.Boss); _colliderRect.SetEliminateType(eEliminateDef.PlayerSpellCard); _colliderRect.SetHitEnemyDamage(1.5f); _colliderRect.SetPosition(Global.PlayerPos.x + _posOffset.x, Global.PlayerPos.y + _posOffset.y); _duration = 240; } _time++; }
public static bool Get(object o, TValue key, out TValue res) { ColliderRect collider = (ColliderRect)o; res = new TValue(); if (key.TtIsString()) { switch (key.SValue()) { #region 基础变量 case "x": { res.SetNValue(collider.GetPosition().x); return(true); } case "y": { res.SetNValue(collider.GetPosition().y); return(true); } case "rot": { res.SetNValue(collider.GetRotation()); return(true); } case "dx": { res.SetNValue(collider.dx); return(true); } case "dy": { res.SetNValue(collider.dy); return(true); } case "SetPos": { res.SetClCsValue(_funcSetPos); return(true); } case "GetPos": { res.SetClCsValue(_funcGetPos); return(true); } #endregion #region 运动相关变量 case "v": { res.SetNValue(collider.velocity); return(true); } case "vx": { res.SetNValue(collider.vx); return(true); } case "vy": { res.SetNValue(collider.vy); return(true); } case "vAngle": { res.SetNValue(collider.vAngle); return(true); } case "maxV": { res.SetNValue(collider.maxVelocity); return(true); } case "acce": { res.SetNValue(collider.acce); return(true); } case "accAngle": { res.SetNValue(collider.accAngle); return(true); } #endregion #region Collider类专属变量 case "SetCollisionGroup": { res.SetClCsValue(_funcSetCollisionGroup); return(true); } case "SetSize": { res.SetClCsValue(_funcSetSize); return(true); } case "SetExistDuration": { res.SetClCsValue(_funcSetExistDuration); return(true); } #endregion #region 运动类专属方法 ISTGMovable case "SetV": { res.SetClCsValue(_funcSetV); return(true); } case "SetAcce": { res.SetClCsValue(_funcSetAcce); return(true); } case "SetStraightParas": { res.SetClCsValue(_funcSetStraightParas); return(true); } case "SetPolarParas": { res.SetClCsValue(_funcSetPolarParas); return(true); } case "MoveTo": { res.SetClCsValue(_funcMoveTo); return(true); } case "MoveTowards": { res.SetClCsValue(_funcMoveTowards); return(true); } #endregion #region IAttachable case "AttachTo": { res.SetClCsValue(_funcAttachTo); return(true); } case "SetRelativePos": { res.SetClCsValue(_funcSetRelativePos); return(true); } #endregion #region ITaskExecuter case "AddTask": { res.SetClCsValue(_funcAddTask); return(true); } #endregion } } res.SetSValue(string.Format("GetField from userData fail!Invalid key {0} for type {1}", key, typeof(ColliderRect).Name)); return(false); }
public static bool Set(object o, TValue key, ref TValue value) { ColliderRect collider = (ColliderRect)o; if (key.TtIsString()) { switch (key.SValue()) { #region 基础变量 case "x": { Vector2 pos = collider.GetPosition(); pos.x = (float)value.NValue; collider.SetPosition(pos); return(true); } case "y": { Vector2 pos = collider.GetPosition(); pos.y = (float)value.NValue; collider.SetPosition(pos); return(true); } case "rot": { collider.SetRotation((float)value.NValue); return(true); } #endregion #region 运动相关变量 case "v": { collider.velocity = (float)value.NValue; return(true); } case "vx": { collider.vx = (float)value.NValue; return(true); } case "vy": { collider.vy = (float)value.NValue; return(true); } case "vAngle": { collider.vAngle = (float)value.NValue; return(true); } case "maxV": { collider.maxVelocity = (float)value.NValue; return(true); } case "acce": { collider.acce = (float)value.NValue; return(true); } case "accAngle": { collider.accAngle = (float)value.NValue; return(true); } #endregion } } value.SetSValue(string.Format("SetField of userData fail!Invalid key {0} for type {1}", key, typeof(ColliderRect).Name)); return(false); }