Unity之闪电侠大战蓝毒兽(简陋的战斗系统)

目录

🎨一、创建地形

🎮二、创建角色

🏃2.1 动画

🏃2.2 拖尾 

🏃2.3 角色控制 

​🏃2.4 技能释放

🏃2.5 准星

📱三、创建敌人

🐲3.1 选择模型

🐲3.2 敌人动画器 

🐲3.3 敌人脚本

💤四、杂谈


新年好啊大家,开工大吉,一起摸鱼!经过小编一个月摸鱼的努力,本篇给自己学到的知识做一个汇总和应用。效果如下动图所示:

小编加入了丑陋的蓝毒兽,并让它看起来不那么傻。它会追击、会进攻、还会死(doge.jpg)。

小编给了它十滴血,当我们控制闪电侠攻击它的时候会实时判断血量HP,HP小于等于0就会触发死亡动画。


当然也有很多不足之处,所以才叫“简陋的战斗系统。。。”我们控制的角色没有加HP,蓝毒兽攻击角色是没有反应的,死了后还在地上滑动起来了。。。估计是爆炸后呲的它来回撞。有空的话小编还会慢慢完善,废话不多说,下面带大家实现这个实例。


一、创建地形

首先地形是小编自己绘制的,教程可以看下面这篇文章。 

Unity之地形的构建-CSDN博客文章浏览阅读1.1k次,点赞16次,收藏19次。PS:公司没活干,好无聊偷偷摸鱼学Unity,害怕自己学完之后忘记,写下这一篇博客https://blog.csdn.net/qq_48512649/article/details/135267070资源商店也有很多好的地形场景,大家可以用自己喜欢的来做。

二、创建角色

角色模型的创建和动作可以参考下面这篇文章。大家选一个自己喜欢的人物模型来做。。。小编当初做练习选的这个就拿来用了也没换,后悔死了,后面都懒得换了。

Unity之动画和角色控制_unity 角色控制-CSDN博客文章浏览阅读1k次,点赞24次,收藏19次。《绿洲大镖客之重生我是闪电侠》😋_unity 角色控制https://blog.csdn.net/qq_48512649/article/details/135775295

作为一个初学者偶然知道的这个模型素材网站,但是我还没用过(简单瞅了瞅里面有闪电侠的模型doge.jpg)爱给网_音效配乐_3D模型_视频素材_免费下载 


Player的标签设置为Player我们后面要用到:

2.1 动画

这里角色的动画器小编分了两个图层:

  1. Base Layer图层是 静止<——>跑步——>起跳——>空中静止——>落地动作,动作的转换参数小编用的BoolTrigger居多。

  2. 第二个图层用来释放技能的,这里小编设计了两个技能

这里讲一下,权重表示图层的权重,跑跳等动作权重(1)比技能权重(0.9)高,播放动画就会优先播放跑跳的动作。

因为释放技能我们只用手来播放动画,这里的遮罩wave, 释放技能时保证手部动作流畅(新建一个遮罩并保留手部为绿色即可,然后加到图层中)。


2.2 拖尾 

 同样在之前的博客闪电侠的拖尾我们是由拖尾组件TrailRenderer实现的,但是实现效果拖尾只出现在了角色脚下那部分。这和我们所熟悉的闪电侠不一样啊。

 为了把拖尾效果覆盖到全身小编就想到了一个很笨很笨的方法。

新建好多个空对象把它们放到角色身上,再把拖尾组件都挂到这些空对象上,这样拖尾效果就覆盖到全身了。(大佬有好的方案教教我o(╥﹏╥)o) 

来看下效果: 

2.3 角色控制 

接下来轮到脚本了,编写FPSMove脚本控制玩家移动和动画之间的转换:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//给玩家挂载 Character Controller 组件
public class FPSMove : MonoBehaviour
{
    private CharacterController cc;
    //移动速度
    public float moveSpeed;
    //跳跃速度
    public float jumpSpeed;
    //定义获得按键值的两个变量
    private float horizontalMove, verticalMove;
    private Vector3 dir;

    //手动实现重力
    public float gravity;
    private Vector3 velocity;
   
    //创建空对象放到玩家最底部用来检测碰没碰到地面,把空对象挂上来
    //检测点的中心位置
    public Transform groundCheck;  
    //检测点的半径
    public float checkRadius;
    //需要检测的图层
    public LayerMask groundLayer;
    //布尔值存储Physics.CheckSphere的返回值
    public bool isGround;
    
    //定义动画变量
    private Animator animator;
    
    private void Start()
    { 
        //获取角色控制组件
        cc = GetComponent<CharacterController>();
        //获取动画组件
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
        //检测玩家是否在地面上,如果定义的球体和物体发生碰撞返回true
        isGround = Physics.CheckSphere(groundCheck.position, checkRadius, groundLayer);
        if (isGround && velocity.y < 0)
        {
            velocity.y = -2f;
        }

        //获得移动按键的值
        horizontalMove = Input.GetAxis("Horizontal") * moveSpeed;
        verticalMove   = Input.GetAxis("Vertical") * moveSpeed;
        dir = transform.forward * verticalMove + transform.right * horizontalMove;
        //实现移动
        cc.Move(dir * Time.deltaTime);
          
        //每秒减去重力的值不断下降,手动实现重力
        velocity.y -= gravity * Time.deltaTime;
        cc.Move(velocity * Time.deltaTime);
          
        //判断是否按下跳跃键
        if (Input.GetButtonDown("Jump") && isGround) 
        {
            //给玩家一个向上的速度
            velocity.y = jumpSpeed;
            //播放跳跃动画
            animator.SetTrigger("Jump");
        }
        isGroundTest();
        
        //如果向量不等于空就证明我们按了方向键了
        if (dir != Vector3.zero)
        {
            //播放跑步动画
            animator.SetBool("IsRun",true);
        }
        //没有按方向键
        else
        {
            //播放站立动画
            animator.SetBool("IsRun",false);
        }
    }

    private void isGroundTest()
    {
        if (isGround == false)
        {
            //播放落地动画
            animator.SetBool("down",true);
        }
        else if (isGround == true)
        {
            //播放落地动画
            animator.SetBool("down",false);
        }
    }
}

 老样子空对象GroundCheck放在角色脚底用来检测角色碰没碰到地面,把地形的图层设置为Ground

2.4 技能释放

技能的模型和发生碰撞后爆炸的原理大家可以根据下面文章回顾一下,小编技能用的模型也是在这里面挑选的:

Unity之物理系统_unity 物理系统-CSDN博客文章浏览阅读1.2k次,点赞21次,收藏20次。专栏的上一篇角色控制器控制角色移动跳崖,这一篇来说说Unity的物理系统。本篇小编还要带大家做一个碰撞检测效果实例,先放效果图:流星撞击地面产生爆炸效果。_unity 物理系统https://blog.csdn.net/qq_48512649/article/details/135600857

编写Gun脚本来控制技能的生成并挂到角色身上:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Gun : MonoBehaviour
{
    //子弹预设体序列化
    [SerializeField]
    private GameObject bulletPrefab;
    
    //游戏对象子弹发射点
    [SerializeField]
    private GameObject bulletPoint;
    
    //子弹速度
    [SerializeField] 
    private float bulletSpeed = 1200;
    
    //定义动画变量
    private Animator animator;
    
    [SerializeField] 
    //获取技能对象
    private GameObject RotatorPS2;

    [SerializeField] 
    private GameObject PS2Point;
    
    // Start is called before the first frame update
    void Start()
    {
        //获取动画组件
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        //判断是否按下技能键
        if (Input.GetButtonDown("Fire1"))
        {
            //播放跳跃动画
            animator.SetTrigger("wave");
            PlayerFireEffectTest();
        }

        //判断是否按下技能键
        if (Input.GetButtonDown("Fire2"))
        {
            //播放技能动画
            PlayerFireEffect();
            //播放技能动画
            animator.SetTrigger("pickUp");
        }
    }
    
    //播放技能特效
    public void PlayerFireEffect()
    {
        Debug.Log("shoot!!!!");
        //生成一个子弹实例,每点击射击一次则生成一枚子弹
        GameObject bullet = Instantiate(RotatorPS2, bulletPoint.transform.position, transform.rotation);
        //启动特效
        bullet.SetActive(true);
        //给子弹一个向前的力
        bullet.GetComponent<Rigidbody>().AddForce(transform.forward * bulletSpeed);
        //8秒关闭
        //Invoke("UnEffect", 8f);
        Destroy(bullet,8);
    }

    public void PlayerFireEffectTest()
    {
        //生成一个子弹实例,每点击射击一次则生成一枚子弹
        GameObject bullet = Instantiate(bulletPrefab, PS2Point.transform.position, transform.rotation);
        //启动特效
        bullet.SetActive(true);
        //给子弹一个向前的力
        bullet.GetComponent<Rigidbody>().AddForce(transform.forward * bulletSpeed);
    }

    // 取消播放技能特效
    private void UnEffect()
    {
        RotatorPS2.SetActive(false);
    }
}

要给你选择的技能特效加上标签,用来识别是否打到蓝毒兽身上。

 这里FirePointPS2Point是一二技能的发射点,把你喜欢的技能特效挂在Gun脚本上,小编这里放了Magic fire2RotatorPS2,别忘了给技能特效加刚体和碰撞组件。

 有了技能还不够,技能发射后碰到物体产生爆炸效果,编写fire脚本挂载到你所选的技能特效预设体上。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Fire : MonoBehaviour
{
    [SerializeField]
    //创建一个爆炸的预设体
    private GameObject Explosion;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    //监听发生碰撞: 只监听发生碰撞的一瞬间
    private void OnCollisionEnter(Collision collision)  //参数 collision 就是你碰撞到的物体的碰撞信息
    {
        //创建一个爆炸物体
        GameObject explosion =Instantiate(Explosion, transform.position, Quaternion.identity);   //参数: 预设体,爆炸位置是自身火焰位置,不旋转
        //销毁自身(流星): 流星撞击地面爆炸物产生流星销毁
        Destroy(gameObject);
        explosion.SetActive(true);
        //获取碰撞到物体看一下参数collision —— 打印一下物体名称,这里打印的是地面的名称
        Debug.Log("撞到了"+collision.gameObject.name);
        
        //实用小技巧
        //给地面一个图层"Ground"   collision.collider.tag == "Ground"   可以判断物体是否踩在地面上
    }
    
    //结束碰撞检测方法
    private void OnCollisionExit(Collision other)
    {
        //collision.collider.tag == "Ground"  判断物体是否离开地面
    }
    
    //监听触发检测
    private void OnTriggerEnter(Collider other)
    {
        
    }
}

比如我这里选的RotatorPS2特效 ,我把fire脚本挂到它身上,ExplosionVariant是爆炸特效。

技能撞倒物体消失产生爆炸效果,爆炸后也会消失,编写 ExplosionTest 脚本挂到爆炸特效上来实现这一功能。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ExplosionTest : MonoBehaviour
{
    float timer = 0;
    // Start is called before the first frame update
    void Start()
    {
        
    }
 
    // Update is called once per frame
    void Update()
    {
        Debug.Log("============这里是explosion");
        //如果时间大于一秒就销毁爆炸物
        timer += Time.deltaTime;
        if (timer > 1)
        {
            Destroy(gameObject);
        }
    }
}

2.5 准星

小编盗用自己的图片来加准星(doge.jpg)

新建一个图像,然后根据下图的数据设置好,还可以选择自己喜欢的颜色,这样准星就设置好了。

 到这里玩家的功能差不多都实现了,下面我们来实现丑陋的蓝毒兽。

三、创建敌人

3.1 选择模型

首先我们去资源商店淘一下敌人的免费模型,毕竟小编很穷o(╥﹏╥)o。搜索monster点击免费资源就会找到下面这个,这个居然是1月26号发布的,当然也有很多其他的优秀资源看个人喜好选择。


在选模型的过程中还闹过笑话,之前选了一个类似大猩猩的模型下半身陷进去了眼睛却还是在原来的位置(这是加了寻路组件之后才这样的),然后在寻路组件的作用下保持这个姿势向我靠近。。。后来也没改过来

 3.2 敌人动画器 

 动画器这里小编编辑的有静止、跑步、攻击、死亡。attack1和attack2小编直接连一块了就,形成一个连击。


至于这里的run和run0,我不知道是模型还是哪出问题了跑步的动画循环播放不了只播放一遍,所以我又又想出了一个很笨很笨的方法让俩跑步动画来回切换达到循环的效果。。。大家不要笑话我。

关于导航网格Nav Mesh Agent组件的使用大家可以回顾这篇文章,使用Nav Mesh Agent组件记得烘焙地形,这里我们用作敌人的寻路功能。

Unity之射线检测和导航系统-CSDN博客文章浏览阅读558次,点赞5次,收藏7次。不知道大家有没有玩过红色警戒 —— 一款即时战略游戏,和罪恶都市一样小编小学的时候就开始玩了,这款游戏控制单位角色移动是通过鼠标的点击来实现。同样的操作方法还有英雄联盟等很多游戏,那本篇文章小编就通过简单小实例来讲解这种操作在Unity中是如何实现的。小编先展示一下实例的演示动图:红色球体表示我们控制的角色,鼠标左键点击小球就会到相应的坐标位置并打印坐标。https://blog.csdn.net/qq_48512649/article/details/135674470这是蓝毒兽挂载的组件大家参考一下:

3.3 敌人脚本

好了接下来我们让丑陋的蓝毒兽变得聪明一点,创建脚本AI挂载到蓝毒兽上:


这里用枚举的方式来描述蓝毒兽的状态。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

//状态
public enum EnemyState
{
    idle,   //静止状态
    run,    //逃跑状态
    attack, //攻击状态
    die     //死亡状态
}

public class AI : MonoBehaviour
{
    //状态
    public EnemyState CurrentState = EnemyState.idle;
    //动画控制器
    private Animator animator;
    //玩家
    private Transform player;
    //导航
    private NavMeshAgent agent;
    //怪兽血量
    private int hp = 10;
    // Start is called before the first frame update
    void Start()
    {
        //获取动画组件
        animator = GetComponent<Animator>();
        agent = GetComponent<NavMeshAgent>();
        player = GameObject.FindWithTag("Player").transform;
    }

    // Update is called once per frame
    void Update()
    {
        float distance = Vector3.Distance(player.position, transform.position);
        //判断状态
        switch (CurrentState)
        {
            case EnemyState.idle:
                idle(distance);
                break;
            case EnemyState.run:
                run(distance);
                break;
            case EnemyState.attack:
                attack(distance);
                break;
            case EnemyState.die:
                die();
                break;
        }
    }

    void idle(float distance)
    {
        //站立状态,如果和玩家距离为5到200米变为跑步
        if (distance >= 5 && distance <= 200)
        {
            CurrentState = EnemyState.run;
        }
        //播放站立动画
        animator.SetBool("IsRun", false);        
        //导航停止
        agent.isStopped = true;
    }
    
    void run(float distance)
    {
        //如果离玩家大于200米,则变为站立
        if (distance >= 200)
        {
            CurrentState = EnemyState.idle;
        }else if (distance < 9)
        {
            CurrentState = EnemyState.attack;
        }
        //播放跑步动画
        animator.SetBool("IsRun", true); 
        animator.SetTrigger("Run1");
        animator.SetTrigger("Run2");
        //导航开始
        agent.isStopped = false;
        agent.SetDestination(player.position);
    }

    void attack(float distance)
    {
        //如果离玩家大于10米,则变为站立
        if (distance >= 10)
        {
            CurrentState = EnemyState.run;
        }
        //播放攻击动画
        animator.SetTrigger("Attack");
    }

    void die()
    {
        //播放死亡动画
        animator.SetTrigger("die");
    }
    
    //监听碰撞检测
    private void OnCollisionEnter(Collision collision)
    {
        //判断是否碰到技能
        if (collision.collider.tag == "Skill")
        {
            //血量减少
            hp--;
            //如果血量少于等于0,敌人死亡
            if (hp <= 0)
            {
                Debug.Log("==========HP:" + hp);
                CurrentState = EnemyState.die;
                //Destroy(gameObject);
            }
        }
    }
}

四、杂谈

实例教程到这里就先结束了,八千多字比我毕业论文字数都多(doge.jpg)。继续扩展的话可以像很多游戏一样设置一个出生点,不断有丑陋的蓝毒兽实例被创建;还可以给我们玩家也加上血条,被攻击也会有击退反应;有想法之后可以进行针对性学习。

自己写的游戏想怎么来就怎么来,拜拜┏(^0^)┛

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/397454.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UI美化stylesheet

一、网上找到自己喜欢的图标 大家可以每个图标类型找出三种不同的颜色&#xff0c;方便后续美化效果&#xff0c;这里我每种只找了一个。&#xff08;随便找的&#xff0c;最后效果不好看&#xff09; 将这个文件夹复制到项目的文件夹中。 然后右键Add New…选择QT&#xff0c…

小迪安全27WEB 攻防-通用漏洞SQL 注入Tamper 脚本Base64Jsonmd5 等

#知识点&#xff1a; 1、数据表现格式类型注入 2、字符转义绕过-宽字节注入 3、数字&字符&搜索&编码&加密等 #参考资料&#xff1a; https://www.cnblogs.com/bmjoker/p/9326258.html 扫描&#xff0c;利用工具等都不会自动判断数据类型&#xff0c…

常见面试题:TCP的四次挥手和TCP的滑动窗口

说一说 TCP 的四次挥手。 挥手即终止 TCP 连接&#xff0c;所谓的四次挥手就是指断开一个 TCP 连接时。需要客户端和服务端总共发出四个包&#xff0c;已确认连接的断开在 socket 编程中&#xff0c;这一过程由客户端或服务端任意一方执行 close 来触发。这里我们假设由客户端…

胶管生产中可自动控制外径的测径仪 你心动吗?

摘要&#xff1a;在线测径仪是测控一体的精密仪器&#xff0c;PID闭环控制方法&#xff0c;提升产品外径质量&#xff0c;可以说连测带控才是真绝色&#xff0c;为胶管品质负责。 关键词&#xff1a;胶管测径仪,测径仪,在线测径仪,外径测量仪,直径测量仪 引言 胶管应用领域众多…

2024最新软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;毕…

若依不分离版本部署流程

一、分离与不分离的区别 参考博客&#xff1a;前后端分离与不分离的本质区别&#xff01;_前后端分离本质-CSDN博客 概念适用场景前后端不分离前端页面看到的效果都是由后端控制&#xff0c;由后端渲染页面或重定向适合纯网页应用前后端分离后端仅返回前端所需的数据&#xf…

《汇编语言》- 读书笔记 - 实验 10 编写子程序

《汇编语言》- 读书笔记 - 实验 10 编写子程序 1. 显示字符串问题子程序描述 show_str提示结果演示 2. 解决除法溢出的问题问题子程序描述 divdw提示结果演示 3. 数值显示问题子程序描述 dtoc提示结果演示 在这次实验中&#xff0c;我们将要编写3个子程序&#xff0c;通过它们来…

UE蓝图 分支(Branch)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 文章目录 系列文章目录一、分支节点功能二、分支节点用法三、分支节点使用场景四、分支节点实现过程五、分支节点相关源码 一、分支节点功能 在Unreal Engine&a…

QGis软件 —— 6、QGis - 线与点相互转化操作

线转为点 1、创建一条线 2、对线用点进行分割&#xff0c;由于下图单位是"度" 那么需要对该图层做重投影。 3、对线做"重投影图层"操作 4、对线用点进行分割 点转为线 将点转为线&#xff0c;如下动图。通常用作于外出人员采集gps点后通过csv文件导入qgis&…

ChatGPT-01 用ChatGPT指令,自学任何领域的系统知识

1. 指令位置 Github仓库&#xff1a;Mr Ranedeer AI Tutor 但是需要开通chatgtp plus版本&#xff0c;并且打开代码解释器 2 使用 学习内容 开始学习 GPT甚至可以给你思考题&#xff0c;给出的答案还能进行评价 配置 通过配置表修改 深度 学习风格 沟通风格 语气风格 …

【Python机器学习】详解Python机器学习进行时间序列预测

&#x1f517; 运行环境&#xff1a;Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

适合tiktok运营的云手机需要满足什么条件?

TikTok作为一款全球热门的社交媒体平台&#xff0c;具有无限的市场潜力。然而&#xff0c;卖家在运营过程中常常会面临到视频0播、账号被降权、限流等问题&#xff0c;甚至可能因为多人同时使用一个IP而导致封号的风险。为了规避这些问题&#xff0c;越来越多的卖家将目光投向了…

领先一步:2024年大广赛设计趋势预测

2024年大赛已经开始&#xff01;作为最具影响力的学科竞赛项目之一&#xff0c;中国大学生好创意全国大学生广告艺术大赛&#xff08;以下简称“大广赛”&#xff09;自2005年以来已举办12届13届大赛&#xff0c;是权威机构认可的以“创意”为核心理念、以“创新”为教育目标的…

JavaScript数据类型学习脑图

字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;

红队学习笔记Day6 --->干货分享

今天看到这样的一个东西&#xff0c;好好好&#xff0c;有点恐怖&#x1f613;&#x1f613;&#x1f631;&#x1f631;&#x1f631;&#x1f631; 我就想网安是不是也有这种东西&#xff1f; 我来试试 icmp&#xff0c;RDP&#xff0c;arp&#xff0c;dhcp&#xff0c;nat&a…

Unity基于AssetBundle资源管理流程详解

在Unity游戏开发中&#xff0c;资源管理是一个非常重要的环节。随着游戏的发展&#xff0c;资源会变得越来越庞大&#xff0c;因此需要一种高效的资源管理方式来减少内存占用和加快加载速度。AssetBundle是Unity提供的一种资源打包和加载方式&#xff0c;可以将资源打包成一个独…

GIS分析-绘制土壤水分图

土壤水分是水文循环的一个重要单元,影响着地下水补给(或深层渗透)和地表径流的水量。此外,土壤水分分析在评估土地退化、荒漠化和洪水方面也发挥着至关重要的作用。土壤水分通常是在野外通过定点测量来确定的,但这种方法虽然结果准确,但却费力费钱。在本研究中,我们将通…

vue3实现瀑布流布局组件

先看效果图 直接上代码 utils.js // 用于模拟接口请求 export const getRemoteData (data 获取数据, time 2000) > {return new Promise((resolve) > {setTimeout(() > {console.log(模拟获取接口数据, data)resolve(data)}, time)}) }// 获取数组随机项 export…

App启动优化笔记 1

app大致的启动流程。有Launcher进程,system_server进程,zygote进程,APP进程。 Launcher进程:启动activity来启动应用 system_server进程:(ams是其中的一个binder):发送一个socket消息给Zygote。 zygote进程:收到消息后,fork新的进程,---》app进程启动 APP进程:…

TRIZ理论下的新能源电机革新之路

随着全球能源结构的转型和环保理念的深入人心&#xff0c;新能源电机作为绿色能源的重要组成部分&#xff0c;正受到越来越多的关注。本文将从TRIZ理论的角度出发&#xff0c;探讨新能源电机的创新与发展。 TRIZ&#xff0c;即发明问题解决理论&#xff0c;是一种创新方法论&am…