//显示升级信息 public void ShowUpgradePanel() { if (PagodaMenu.Instanc.readyToPlace == false) { if (upgradePanel.gameObject.activeInHierarchy && Vector3.Distance(upgradePanel.transform.position, Input.mousePosition) >= 300) { CloseUpgradePanel(); } //从摄像机发射射线,检测防御塔地形 Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 500, LayerMask.GetMask("Pagoda"))) { //照射到的地形上有防御塔,显示升级信息 if (hit.collider.transform.childCount > 0) { hitTerrain = hit.collider.transform; //得到防御塔信息 Pagoda pagoda = hitTerrain.GetComponentInChildren <Pagoda>(); //显示升级信息 upgradePanel.ShowPagodaInfo(pagoda); } } } else { upgradePanel.gameObject.SetActive(false); } }
//显示防御塔信息 public void ShowPagodaInfo(Pagoda _pagoda) { gameObject.SetActive(true); pagoda = _pagoda; RefreshInfo(); ShowattRange(); }
Pagoda pagoda; //防御塔信息 //初始化 public void InitBullet(Vector3 position, Quaternion rotation, Enemy _target, float _damage, Transform _pool, Pagoda _pagoda) { transform.SetParent(null); transform.position = position; transform.rotation = rotation; target = _target; damage = _damage; pool = _pool; initPos = transform.position; pagoda = _pagoda; }
//死亡方法 public override void Death(Pagoda murderer) { base.Death(murderer); gameObject.layer = LayerMask.NameToLayer("DeadBody"); //层设置为"DeadBody" state = EnemyState.death; anim.Play("death"); Util.Instance.AddTimeTask(() => transform.SetParent(enemyPool), 5); //5秒后返回对象池 GameData.Instance.AddGold(gold); //获得金币奖励 PagodaMenu.Instanc.RefreshMenu(); //刷新菜单 //标记处决者 murderer.PlayKill(murderer.transform.position, "击杀", Color.red); }
//初始化 public void Init(Camera _mainCamera, Transform _attRange) { //自身图片的名字就是对应防御塔名字 image = GetComponent <Image>(); pagodaName = image.sprite.name; pagodaObj = Resources.Load <Pagoda>("Prefab/Chara/PagodaChara/" + pagodaName); pagodaObj.pagodaPool = GameObjectPool.Instance.GetPool(pagodaName); gold = pagodaObj.gold; goldTxet.text = gold.ToString(); mainCamera = _mainCamera; attRange = _attRange; ria = attRange.GetComponent <MeshRenderer>().material; layer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Way") | LayerMask.GetMask("Pagoda"); }
public void Damage(float damage, Pagoda murderer) //受伤方法,参数为受到的伤害值和给予最后一击的防御塔 { if (surHp > damage) //当前血量大于受伤血量,正常扣血 { surHp -= damage; //受伤后开始显示血条 if (surHp < totalHp) { hpObj.gameObject.SetActive(true); } Vector3 hpScale = redHp.localScale; hpScale.x = surHp / totalHp; redHp.localScale = hpScale; } else //当前血量不够,调用死亡方法 { Death(murderer); } }
//点击头像实例化防御塔 public void OnPointerDown(PointerEventData eventData) { PagodaMenu.Instanc.readyToPlace = true; //实例化防御塔模型并命名 obj = pagodaObj.pagodaPool.GetComponentInChildren <Pagoda>(); if (obj != null) { obj.transform.SetParent(null); } else { obj = Instantiate(pagodaObj); obj.name = pagodaName + Time.time; } //启用攻击范围显示器并将防御塔攻击方位反映在尺寸上 attRange.gameObject.SetActive(true); attRange.localScale = new Vector3(obj.attactRange * 2, 1, obj.attactRange * 2); image.color = new Color(0, 1, 0); //头像变色 }
Transform terrain; //可放置地形 //抬起鼠标放置或删除防御塔 public void OnPointerUp(PointerEventData eventData) { PagodaMenu.Instanc.readyToPlace = false; image.color = new Color(1, 1, 1); //头像变色 if (isPlace) //可放置时 { //放置在该地形并成为地形子物体,然后初始化 obj.transform.position = terrain.position; obj.transform.SetParent(terrain); obj.initPagoda(); //消耗金币和刷新菜单 GameData.Instance.SubGold(pagodaObj.gold); PagodaMenu.Instanc.RefreshMenu(); } else //不可放置则销毁重置 { obj.transform.SetParent(obj.pagodaPool); } obj = null; attRange.gameObject.SetActive(false); //禁用范围显示器 ria.color = new Color(0, 1, 0, 0.3f); }
public virtual void Death(Pagoda murderer) //死亡方法 { surHp = 0; hpObj.gameObject.SetActive(false); //血条不再显示 }
public override void Death(Pagoda murderer) //重写死亡方法 { base.Death(murderer); anim.enabled = false; GameMain.instance.GameOver(); }
public Village GenerateVillage(List <Path> paths, int seed) { var random = new Random(seed); var points = Lines .SelectMany((maxY, x) => Enumerable.Range(0, maxY).Select(y => new Point(x + 1, y + 1, X0, Y0))) .OrderBy(p => p.Dist) .ToList(); var pagodas = new List <Pagoda>(); var pathMetas = new List <PathMeta>(); var allDays = new List <(Day, int)>(); foreach (var path in paths) { if (path == null || string.IsNullOrEmpty(path.Data.Name)) { continue; } var nonEmptyDays = path.Days .Where(d => d.Type != DateType.N && d.Type != DateType.Link && d.Type != DateType.Checkpoint) .Select(d => (d, path.Data.Color)) .ToList(); // calculate last unbreakable chain length var daysLast = nonEmptyDays.AsEnumerable() .Reverse() .TakeWhile(d => d.Item1.Type == DateType.Done || d.Item1.Type == DateType.DoneLink) .Count(); pathMetas.Add(path.Data.ToMeta(daysLast)); // store days allDays.AddRange(nonEmptyDays); } // enumerate all days allDays = allDays.OrderBy(d => d.Item1.Date).ToList(); // generate pagodas foreach (var(day, color) in allDays) { var isBreak = day.Type == DateType.Break; var pagodasOfColor = pagodas.Where(p => p.Color == color).ToList(); if (isBreak && pagodasOfColor.Count > 0) { // on break destroy random pagoda var pIndex = random.Next(0, pagodasOfColor.Count); pagodas.Remove(pagodasOfColor[pIndex]); } else if (!isBreak) { // level up random pagoda or create a new one var levelUp = random.Next(100) <= 25; var notMaxPagodas = pagodasOfColor.Where(p => p.Level < MaxLevel).ToList(); if ((levelUp || points.Count == 0) && notMaxPagodas.Count > 0) { var nmIndex = random.Next(0, notMaxPagodas.Count); notMaxPagodas[nmIndex].Level++; } else if (points.Count > 0) { // create a new one var pointIndex = random.Next(0, Math.Min(NewPagodaPointRange, points.Count)); var point = points[pointIndex]; points.RemoveAt(pointIndex); var pagoda = new Pagoda { X = point.X, Y = point.Y, Color = color, Level = 1 }; pagodas.Add(pagoda); } else { break; } } } return(new Village { Pagodas = pagodas.OrderBy(p => p.X).ThenBy(p => p.Y).ToList(), Paths = pathMetas }); }