新动画系统:
反向动力学动画(IK功能):
魔兽世界(头部动画),神秘海域(手部动画),人类一败涂地(手部动画)
如何启用(调整)
1、必须是新动画系统Animator

设置头、手、肘的目标点

2、动画类型必须是Humanoid,除此之外其他类型都不可以

3、动画系统对应层级的IKPass必须开启

4、相应的IK调整方法只能写在OnAnimatorIK(脚本挂载和Animator同一级别)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DefaultAvatarIK : MonoBehaviour {public Animator anim;public Transform lookPoint;public Transform HandPoint;public Transform ElbowPoint;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}private void OnAnimatorIK(int layerIndex){//用代码调整头部看向的方向
        anim.SetLookAtPosition(lookPoint.position);//调整IK动画的权重//如果是1代表完全按代码逻辑播放动画(完全融合)//如果是0完全按原动画播放anim.SetLookAtWeight(1);//调整四肢IK的目标点anim.SetIKPosition(AvatarIKGoal.LeftHand, HandPoint.position);//AvatarIKGoal是枚举anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);//调整四肢IK关节的目标点
        anim.SetIKHintPosition(AvatarIKHint.RightElbow, ElbowPoint.position);anim.SetIKHintPositionWeight(AvatarIKHint.RightElbow, 1);//调整四肢IK的朝向//anim.SetIKRotation();
    }
}

取消物体描边

粒子系统:
Particle System一统江湖,主流离子发射器思想,调整发射器参数发射离子,如AE
Legacy都是老的粒子系统

一个粒子效果由若干个Particle System构成

修改大小
我们没有办法通过GameObject的Scale改大小,Scale只是改变发射区域的大小
可以通过StartSize

可以通过SizeOverLife曲线

启用碰撞
碰撞系统,火焰溅射效果
打开粒子的Collision功能,选择Type为World,平面改3D

也可以选择Type为Planes,设置一个平面触发效果

拖尾效果

脚本使用:播放,停止,销毁

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParticleTest : MonoBehaviour {public ParticleSystem ps;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (Input.GetKeyDown(KeyCode.Alpha1)){//调用粒子系统播放
            ps.Play();}if (Input.GetKeyDown(KeyCode.Alpha2)){//调用粒子系统停止
            ps.Stop();}if (Input.GetKeyDown(KeyCode.Alpha3)){if (ps.isStopped){//失活粒子gameObject.SetActive(false);}}}
}

重载,连同子级一起处理,填flase只负责自身

取消唤醒,改为代码播放

塔防游戏:
怪物管理器:
添加路点(路点放在拐点处),给怪物子类添加路点列表
currentPathNodeID:记录当前路点的变量
pathNodeList.Count-1:路点的最后一个点
移动逻辑
数组越界问题:调整currentPathNodeID++的位置到最后
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonsterA : MonsterBase {public Animator anim;public Transform pathParent;public List<Transform> pathNodeList;public int currentPathNodeID;public float speed;// Use this for initializationvoid Start () {anim = GetComponent<Animator>();//初始化路点列表pathNodeList = new List<Transform>();//把路点导入到路点列表for (int i = 0; i < pathParent.childCount; i++){pathNodeList.Add(pathParent.GetChild(i));}//把自己放在路点的第一个位置transform.position = pathNodeList[0].position;currentPathNodeID = 0;monsterSta = MonsterSta.Move;anim.SetBool("isMove", true);}// Update is called once per framevoid Update () {#region 动画测试//if (Input.GetKeyDown(KeyCode.Alpha1))//{//    monsterSta = MonsterSta.Move;//    anim.SetBool("isMove", true);//}//if (Input.GetKeyDown(KeyCode.Alpha2))//{//    monsterSta = MonsterSta.Idle;//    anim.SetBool("isMove", false);//}//if (Input.GetKeyDown(KeyCode.Alpha3))//{//    monsterSta = MonsterSta.Death;//    anim.SetTrigger("Death");//}#endregionAction();}public override void Action(){switch (monsterSta){case MonsterSta.Idle:Idle();break;case MonsterSta.Move:Move();break;case MonsterSta.Death:Death();break;default:break;}}public override void Move(){//如果怪物还没有到达路点中最后一个点if (currentPathNodeID < pathNodeList.Count-1){//向下一个点前进float distance = Vector3.Distance(transform.position, pathNodeList[currentPathNodeID + 1].position);transform.position = Vector3.Lerp(transform.position, pathNodeList[currentPathNodeID + 1].position, speed/ distance*Time.deltaTime);//如果我离下一个点的距离到达某一个值
        Quaternion targetRot = Quaternion.LookRotation(pathNodeList[currentPathNodeID + 1].position - pathNodeList[currentPathNodeID].position);transform.rotation = Quaternion.Slerp(transform.rotation, targetRot, 0.1f);//transform.LookAt(pathNodeList[currentPathNodeID + 1]);if (distance < speed * Time.deltaTime){//改变我的当前点,进而改变目标点,成下一个点currentPathNodeID++;}}}
}

保留原动画状态机的逻辑,可以替换原动画片段

机枪塔,需要瞄准,攻击速快
炮塔,不用瞄准,攻速慢
塔基
外层(空物体):缩放(1,1,1)
内层(Tower_Base):缩放(0.4,0.4,0.4)
外层添加刚体

内层添加球形碰撞体,勾选Is Trigger

塔基父类代码逻辑

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GunBase : MonoBehaviour {public float attackRange;public MonsterBase tragetMonster;public SphereCollider attackTrigger;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}public virtual void Indit() {attackTrigger.radius = attackRange;}public virtual void Attack() {}
}

塔基子类代码逻辑

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GunB : GunBase {public Transform gunPos;public ParticleSystem ps;// Use this for initializationvoid Start () {Indit();}// Update is called once per framevoid Update () {Attack();fireCDTime += Time.deltaTime;}public override void Attack(){if (tragetMonster!=null){if (AttackCheck()){if (fireCDTime> fireCD){Fire();}}else{RotatGun();}}else{ps.Stop();}}public void RotatGun() {Vector3 dir = tragetMonster.transform.position - gunPos.position;dir.y = 0;Quaternion targetRot = Quaternion.LookRotation(dir);gunPos.rotation = Quaternion.Slerp(gunPos.rotation, targetRot, 0.5f);}float fireCD = 0.1f;float fireCDTime;public void Fire() {fireCDTime = 0;tragetMonster.Damage();ps.Play();//特效代码逻辑
    }public bool AttackCheck() {Vector3 monsterDir = tragetMonster.transform.position - gunPos.position;monsterDir.y = 0;if (Vector3.Angle(gunPos.forward, monsterDir)<5){return true;}return false;}//如果有物体进入我的攻击范围private void OnTriggerEnter(Collider other){//如果我没有目标if (tragetMonster==null){//如果进入我攻击范围的Collider标签是"Monster"if (other.tag == "Monster"){//把这个Monster设置成我的目标tragetMonster = other.GetComponent<MonsterBase>();}}}//如果有物体离开我的攻击范围private void OnTriggerExit(Collider other){//如果我有目标if (tragetMonster != null){//如果离开的目标是我的目标if (tragetMonster == other.GetComponent<MonsterBase>()){//我的目标为空tragetMonster = null;}}}
}

设置攻击范围

塔基父类代码逻辑:设置Indit初始化,给碰撞器添加攻击范围

public virtual void Indit() {attackTrigger.radius = attackRange;
}

攻击检测:炮塔转向
球形差值,正负转向
线性差值,只能正向
    public override void Attack(){if (tragetMonster!=null){if (AttackCheck()){if (fireCDTime> fireCD){Fire();}}else{RotatGun();}}else{ps.Stop();}}public void RotatGun() {Vector3 dir = tragetMonster.transform.position - gunPos.position;dir.y = 0;Quaternion targetRot = Quaternion.LookRotation(dir);gunPos.rotation = Quaternion.Slerp(gunPos.rotation, targetRot, 0.5f);}

目标点不对的问题:
dir.y = 0;转向方法的y轴清零
monsterDir.y = 0;攻击检测的角度也要清零
    public void RotatGun() {Vector3 dir = tragetMonster.transform.position - gunPos.position;dir.y = 0;Quaternion targetRot = Quaternion.LookRotation(dir);gunPos.rotation = Quaternion.Slerp(gunPos.rotation, targetRot, 0.5f);}float fireCD = 0.1f;float fireCDTime;public void Fire() {fireCDTime = 0;tragetMonster.Damage();ps.Play();//特效代码逻辑
    }public bool AttackCheck() {Vector3 monsterDir = tragetMonster.transform.position - gunPos.position;monsterDir.y = 0;if (Vector3.Angle(gunPos.forward, monsterDir)<5){return true;}re

转载于:https://www.cnblogs.com/cnwuchao/p/10363313.html

Unity3D学习笔记(十七):IK动画、粒子系统和塔防相关推荐

  1. unity3d学习笔记——老版动画系统的使用

    新的动画系统mechanim相对老版的动画系统,功能强大了不少,但是消耗也不小--需要计算的东西就更多了,所以学习新的动画系统的同时,掌握并使用老版动画系统也是很必要的,虽然老版动画系统相对简单得多, ...

  2. Mr.J-- jQuery学习笔记(十七)--动画淡入淡出弹窗广告

    之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 展开 ...

  3. Unity3D学习笔记:粒子特效参数

    Unity3D学习笔记:粒子特效参数含义 转载 https://blog.csdn.net/asd237241291/article/details/8433534 粒子特效 粒子系统检视面板 初始化 ...

  4. unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)

    Unity3D学习笔记(四)天空.光晕和迷雾 六年前第一次接触<魔兽世界>的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的地方,深深印在我的脑海里.当时在艾泽拉斯大陆还不能使用飞行坐骑,试 ...

  5. ReactJS学习笔记八:动画

    ReactJS学习笔记八:动画 分类: react学习笔记 javascript2015-07-06 20:27 321人阅读 评论(0) 收藏 举报 react动画 目录(?)[+] 这里只讨论Re ...

  6. iOS学习笔记-自定义过渡动画

    代码地址如下: http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swi ...

  7. Unity3D 学习笔记3——了解U3D引擎的操作面板和各种工具

    Unity3D 学习笔记3--了解U3D引擎的操作面板和各种工具 在完成了Unity的安装破解之后,我们接下来要做的当前是启动这个引擎,然后学会如何去使用它为我们提供的各种工具,这也是上手任何一个软件 ...

  8. Unity3D 学习笔记4 —— UGUI+uLua游戏框架

    Unity3D 学习笔记4 -- UGUI+uLua游戏框架 使用到的资料下载地址以及基础知识 框架讲解 拓展热更过程 在这里我们使用的是uLua/cstolua技术空间所以提供的UGUI+uLua的 ...

  9. Unity3D学习笔记6——GPU实例化(1)

    文章目录 1. 概述 2. 详论 3. 参考 1. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成 ...

  10. Unity3D学习笔记8——GPU实例化(3)

    文章目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1) ...

最新文章

  1. UVa 679 - Dropping Balls
  2. echart折线图,柱状图,饼图设置颜色
  3. C语言实现哈希表(附完整源码)
  4. 怎么创建dllwenjian_如何创建和使用dll及lib文件
  5. Windows进程管理类封装
  6. Node.js 入门知识点总结
  7. 人工智能+人=强大的网络安全
  8. while 中 break 与 continue 的区别
  9. 【Asp.net Core】在 Linux 子系统中安装 nginx 并配置反向代理
  10. android之uniapp自定义基座
  11. 老年代的更新机制_魔兽世界:60年代五大“远古”机制,这根胡萝卜,可是当年的神器...
  12. .Hbase批量导入数据应用
  13. excel vb连接mysql数据库教程视频教程_VB6.0与Access数据库关联、VB6.0与Excel数据导入导出案例...
  14. html 设置字体加粗,css如何设置字体加粗样式?
  15. 任意长度的python列表元组_【任】 任怎么读|组词|读音|拼音|多音字|意思 - 辞海之家...
  16. Python-金融应用-获取股票年度收益率
  17. matlab simulink的constant模块
  18. 踩坑日志1----从zuulFilter到Filter
  19. Word如何取消打印前自动更新域
  20. Java导出带有单选款(radio)和复选框(checkbox)选中效果的word doc文档-Freemarker实现方式

热门文章

  1. 哪个牌子的护眼灯防蓝光效果好?防蓝光护眼灯品牌排行
  2. 内存条相关参数查看方法
  3. 读养生四要有感《却疾篇》
  4. 八叉树 java_八叉树(Octree)
  5. Java框架面试题总结
  6. 小米宣布率先搭配鸿蒙系统,重磅消息,主流手机厂商近期将会宣布率先搭载鸿蒙系统!有奖竞猜...
  7. 计算机课活动方案,第二课堂(计算机)兴趣小组活动方案
  8. HTC最快7月进军大陆;360创始人将推免费杀毒软件(20100524)
  9. NBIOT模组BC95功耗控制的问题
  10. [转帖]某外贸公司的面试题!自认为不赖的人士请进!