当前位置: 首页 > news >正文

外贸seo网站建设wordpress+客户端

外贸seo网站建设,wordpress+客户端,Audiology wordpress,视频网站 如何做seo精确获取碰撞点 核心是获取武器碰撞盒最顶点#xff0c;然后获取敌人碰撞盒距离该点最近的点 /// summary/// 获取获取武器前端位置 碰撞盒最左或最右顶点/// /summary/// param namecollider/param/// param name…精确获取碰撞点 核心是获取武器碰撞盒最顶点然后获取敌人碰撞盒距离该点最近的点 /// summary/// 获取获取武器前端位置 碰撞盒最左或最右顶点/// /summary/// param namecollider/param/// param namefacingRight/param/// returns/returnspublic static Vector3 GetCollider2DEdgePoint(Transform deployer, bool facingRight){var collider deployer.GetChild(0).GetComponentInChildrenCapsuleCollider2D();// 获取碰撞器的包围盒Bounds bounds collider.bounds;// 计算面向的方向向量右或左Vector2 attackDirection facingRight ? Vector2.right : Vector2.left;// 根据面向方向和碰撞器的边界来获取边缘点Vector3 edgePoint bounds.center (Vector3)(attackDirection * bounds.extents.x);// 如果需要在局部空间中获取边缘点需要将世界坐标转换为局部坐标// edgePoint deployer.InverseTransformPoint(edgePoint);return edgePoint;}//使用public void CreateHit(Collider2D other, CharacterStats target, bool isCrit false)Vector3 edgePoint Tool.GetCollider2DEdgePoint(transform, Entity.facingRight);var hitPosition other.ClosestPoint(edgePoint);1. 给攻击帧添加碰撞盒 优点配置直观无需事件触发 缺点无法定制效率低 检测放在子物体可以控制旋转 添加触发器事件 注意OnTriggerEnter2D只会在挂载了collider的组件上触发 protected virtual void OnTriggerEnter2D(Collider2D other){Debug.Log(this.name 命中 other);entity.AttackTrigger(other);} 在角色脚本执行攻击检测 public override void AttackTrigger(Collider2D other){if (other.gameObject.layer LayerMask.NameToLayer(Enemy)){base.AttackTrigger(other);AttackColliderCheckEnemy(other, (enemy) enemy.BeDamage(stats));}}2. 为每个攻击动画状态使用射线检测 优点效率高于碰撞盒可以定制比如增加攻击范围 缺点配置麻烦不直观 部分代码仅供参考 定义每个动画的检测范围 [Header(攻击状态对应的碰撞盒)]public DictionaryEntity.States, AttackRanges attackRangeDict new();//索引是攻击的状态 连击数获取对应攻击的范围 [System.Serializable] public class AttackRanges {/// summary/// 对应的连击次数 作为索引/// /summarypublic AttackRange[] ranges new AttackRange[1];//索引器public AttackRange this[int index]{get{// return ranges.FirstOrDefault(x x.combo index);//如果没有默认用第一个if (index ranges.Length)return ranges[0];return ranges[index];}} }[System.Serializable] public class AttackRange {public SerializableVector2 offset new();public SerializableVector2 size new();public float rotation 0;public UnityEngine.Vector2 Offset offset.ToVector2();public UnityEngine.Vector2 Size size.ToVector2(); }添加帧事件 private void AttackTrigger(){entity.AttackTrigger();}执行检测与绘制范围 /// summary/// 攻击检测/// /summary/// typeparam nameT/typeparam/// param nameaction/paramprotected void AttackColliderCheckT(ActionT action) where T : Entity{AttackRange attackRange stats.attackRangeDict[States.PrimaryAttack][ComboCounter];var offset facingRight ? attackRange.offset.ToVector2() : new Vector2(-attackRange.offset.x, attackRange.offset.y);var rotation facingRight ? attackRange.rotation : -attackRange.rotation;Collider2D[] colliders Physics2D.OverlapBoxAll(offset, attackRange.size.ToVector2(), rotation);foreach (Collider2D hit in colliders){if (hit.TryGetComponentT(out T entity)){action?.Invoke(entity);}}}// 默认情况下就会在编辑模式下运行protected virtual void OnDrawGizmos(){// Vector3 boxCenter groundCheck.position Vector3.down * groundCheckDistance / 2;// Gizmos.DrawCube(boxCenter, new Vector3(groundCheckWidth, groundCheckDistance, 0));Gizmos.DrawLine(groundCheck.position, new Vector3(groundCheck.position.x, groundCheck.position.y - groundCheckDistance));//绘制一条从 from(前面的) 开始到 to后面的 的线。Gizmos.DrawLine(wallCheck.position, new Vector3(wallCheck.position.x wallCheckDistance, wallCheck.position.y));//绘制一条从 from(前面的) 开始到 to后面的 的线。if (stats null) return;Gizmos.color Color.red;var attackRange stats.attackRangeDict.ContainsKey(States.PrimaryAttack) ? stats.attackRangeDict?[States.PrimaryAttack]?[ComboCounter] : new AttackRange();Vector3 center (Vector3)attackRange.Offset;// 设置 Gizmos 的变换矩阵Matrix4x4 oldMatrix Gizmos.matrix;Gizmos.matrix Matrix4x4.TRS(center, Quaternion.Euler(0, 0, attackRange.rotation), Vector3.one);Gizmos.DrawWireCube(transform.position (Vector3)attackRange.Offset, (Vector3)attackRange.Size);// 恢复原来的矩阵Gizmos.matrix oldMatrix;}3. 所有动画共用一个射线检测 优点简单 缺点不精确 在帧事件触发调用检测方法即可 /// summary/// 攻击检测/// /summary/// typeparam nameT/typeparam/// param nameaction/paramprotected void AttackColliderCheckT(ActionT action) where T : Entity{Collider2D[] colliders Physics2D.OverlapCircleAll(attackCheck.position, attckCheckRadius);foreach (Collider2D hit in colliders){if (hit.TryGetComponentT(out T entity)){action?.Invoke(entity);}}}
http://www.lakalapos1.cn/news/15569/

相关文章:

  • 做空间的网站吗seo怎么学在哪里学
  • 食品网站的建设背景网站新建网页
  • 怎样做类似淘宝的网站公司调查公司
  • 深圳市住房和城乡和建设局网站网站建设 开发工具 python
  • 网站开发报价网站建设评分细则
  • 网站建设逻辑组织的几种模型重庆建筑安全信息网
  • 引导式网站crm
  • 上海网站推广服务公司网站界面设计如何实现功能美与形式美的统一?
  • 京东网站建设策略设计师35岁后的出路
  • c 做网站 知乎张家港手机网站设计
  • 专业广州做网站公司wordpress 使用方法
  • 卓越网站建设的优点义乌上溪镇
  • 明星静态网站网站建设与管理课程设计论文
  • 网站基础服务关于网站建设的故事
  • 超市如何建立网站没经验的人开什么店好
  • wordpress+手机站wordpress主题 微博
  • 旅游门户网站有哪些排名app
  • php网站底部文件家在深圳app下载官网
  • 六安人社局网站莱芜地板街50一次
  • 网站建设推广和网络推广广州的网站建设
  • 阳谷网站建设网络推广wordpress多主题插件
  • c 网站开发需要的技术网络游戏开发专业
  • 河北网站建设推广服装网站设计欣赏
  • 网站系统建设管理制度网站建设漂亮的模板
  • 如何建立一个网站平台鲜花销售网站开发费用
  • 飞浪网站建设北京网站设计公司招聘信息
  • 怎么做非法彩票网站wordpress 响应式菜单
  • 采集网站怎么做个人网站制作体会
  • 个人网站建设服务百度数据库
  • 网站组成部分萍乡建设网站