unity制作手游fps僵尸游戏

news2024/11/24 11:45:32

文章目录

  • 介绍
  • 制作基本UI
  • 枚举控制角色移动
  • 切枪、设置音效、设置子弹威力、设置子弹时间间隔、换弹
  • 准星控制射击
  • 僵尸动画、血条
  • 设置导航


介绍

在这里插入图片描述

在这里插入图片描述
利用协程、枚举、动画器、导航等知识点。
实现移动、切枪、换弹、射击、僵尸追踪、攻击。


制作基本UI

制作人类血条、僵尸血条、移动按钮、换弹按钮、射击按钮、切枪按钮、准星。

在这里插入图片描述


枚举控制角色移动

在这里插入图片描述
Move(Movestate moveState): 根据传入的移动状态,控制玩家的移动。可以根据Movestate枚举类型的值来选择不同的移动方向。
StopMove(): 停止玩家的移动,将移动状态设置为停止状态。
MoveForward(): 将移动状态设置为向前移动状态。
MoveBackward(): 将移动状态设置为向后移动状态。
MoveLeft(): 将移动状态设置为向左移动状态。
MoveRight(): 将移动状态设置为向右移动状态。
Button_Move(string state): 通过传入的字符串参数设置移动状态。使用System.Enum.Parse将字符串解析为Movestate枚举类型的值。
Button_Drag(): 处理鼠标拖动的操作,获取鼠标在水平和垂直方向上的移动量,调用Rotatingplay()和RotatingCamera()函数来旋转玩家和相机。
Rotatingplay(float x): 绕Y轴旋转玩家。
RotatingCamera(float y): 绕X轴旋转相机,但限制了相机的旋转角度,确保相机不会旋转超过一定角度。
OnTriggerEnter(Collider other): 当触发器与其他物体发生碰撞时调用,输出调试信息。

using System.Collections; // 引用命名空间 System.Collections
using System.Collections.Generic; // 引用命名空间 System.Collections.Generic
using UnityEngine; // 引用命名空间 UnityEngine

public class player : MonoBehaviour // 定义一个名为 player 的类,并继承自 MonoBehaviour 类
{
	public enum Movestate{stop,forward,backward,left,right} // 定义一个名为 Movestate 的枚举类型,表示角色的移动状态

	public Movestate currentState; // 定义一个名为 currentState 的变量,表示当前角色的移动状态
	public float movespeed=1; // 定义一个名为 movespeed 的变量,表示角色的移动速度
	public CharacterController ch; // 定义一个名为 ch 的 CharacterController 变量,用于控制角色移动
	public Transform camtrans; // 定义一个名为 camtrans 的 Transform 变量,用于控制相机旋转

    void Start() // Start 方法,在第一帧开始前执行
    {
	    ch=GetComponent<CharacterController>(); // 获取角色的 CharacterController 组件,并赋值给 ch 变量
	    camtrans=transform.Find("Main Camera"); // 查找名为 "Main Camera" 的子对象,并将其 Transform 组件赋值给 camtrans 变量
    }

    void Update() // Update 方法,在每一帧更新时执行
    {
	    Move(currentState); // 调用 Move 方法,传入 currentState 参数
    }
	    
	public void Move(Movestate moveState){ // 定义一个名为 Move 的公共方法,用于控制角色的移动
		
		switch(moveState){ // 根据 moveState 参数的不同,执行不同的操作
		case Movestate.stop: // 如果 moveState 等于 stop,则执行下面的代码
			break; // 跳出 switch 语句
		case Movestate.forward: // 如果 moveState 等于 forward,则执行下面的代码
			//transform.Translate(transform.forward*Time.deltaTime*movespeed); // 使用 Transform 的 Translate 方法,向前移动角色
			ch.SimpleMove(transform.forward*movespeed); // 使用 CharacterController 的 SimpleMove 方法,向前移动角色
			break; // 跳出 switch 语句
		case Movestate.backward: // 如果 moveState 等于 backward,则执行下面的代码
			//transform.Translate(-transform.forward*Time.deltaTime*movespeed); // 使用 Transform 的 Translate 方法,向后移动角色
			ch.SimpleMove(-transform.forward*movespeed); // 使用 CharacterController 的 SimpleMove 方法,向后移动角色
			break; // 跳出 switch 语句
		case Movestate.left: // 如果 moveState 等于 left,则执行下面的代码
			//transform.Translate(-transform.right*Time.deltaTime*movespeed); // 使用 Transform 的 Translate 方法,向左移动角色
			ch.SimpleMove(-transform.right*movespeed); // 使用 CharacterController 的 SimpleMove 方法,向左移动角色
			break; // 跳出 switch 语句
		case Movestate.right: // 如果 moveState 等于 right,则执行下面的代码
			//transform.Translate(transform.right*Time.deltaTime*movespeed); // 使用 Transform 的 Translate 方法,向右移动角色
			ch.SimpleMove(transform.right*movespeed); // 使用 CharacterController 的 SimpleMove 方法,向右移动角色
			break; // 跳出 switch 语句
		default: // 如果 moveState 不等于以上任何一个值,则执行下面的代码
			break; // 跳出 switch 语句
		}
	}
	
	public void StopMove(){ // 定义一个名为 StopMove 的公共方法,用于停止角色的移动
		
		currentState=Movestate.stop; // 将 currentState 变量的值设为 stop
	}
	
	public void MoveForward(){ // 定义一个名为 MoveForward 的公共方法,用于向前移动角色
		
		currentState=Movestate.forward; // 将 currentState 变量的值设为 forward
	}
	
	public void MoveBackward(){ // 定义一个名为 MoveBackward 的公共方法,用于向后移动角色
		
		currentState=Movestate.backward; // 将 currentState 变量的值设为 backward
	}
	
	public void MoveLeft(){ // 定义一个名为 MoveLeft 的公共方法,用于向左移动角色
		
		currentState=Movestate.left; // 将 currentState 变量的值设为 left
	}
	
	public void MoveRight(){ // 定义一个名为 MoveRight 的公共方法,用于向右移动角色
		
		currentState=Movestate.right; // 将 currentState 变量的值设为 right
	}
	
	public void Button_Move(string state){ // 定义一个名为 Button_Move 的公共方法,用于响应移动按钮的点击事件,并根据点击事件的参数改变角色的移动状态
		
		var e=System.Enum.Parse(typeof(player.Movestate),state); // 将字符串类型的 state 参数转换为 Movestate 枚举类型,并赋值给 e 变量
		currentState=(player.Movestate)e; // 将 e 变量的值赋给 currentState 变量,从而改变角色的移动状态
	}
	
	public void Button_Drag(){ // 定义一个名为 Button_Drag 的公共方法,用于响应拖拽事件
		
		float x=Input.GetAxis("Mouse X"); // 获取鼠标水平方向的移动距离
		float y=Input.GetAxis("Mouse Y"); // 获取鼠标垂直方向的移动距离
		Rotatingplay(x); // 调用 Rotatingplay 方法,传入 x 参数,用于旋转角色
		RotatingCamera(y); // 调用 RotatingCamera 方法,传入 y 参数,用于旋转相机
	}
	
	private void Rotatingplay(float x){ // 定义一个名为 Rotatingplay 的私有方法,用于旋转角色
		
		transform.Rotate(0,x,0); // 使用 Transform 的 Rotate 方法,绕 y 轴旋转角色
	}
	
	private void RotatingCamera(float y){ // 定义一个名为 RotatingCamera 的私有方法,用于旋转相机
		
		if ((-45< camtrans.rotation.x)&&(camtrans.rotation.x<45)) // 如果相机的 x 轴旋转角度在 -45 度到 45 度之间
		{
			camtrans.Rotate(-y,0,0); // 使用 Transform 的 Rotate 方法,绕 x 轴旋转相机
		}
	}
	
	private void OnTriggerEnter(Collider other){ // 定义一个名为 OnTriggerEnter 的私有方法,用于响应角色进入触发器的事件,并输出调试信息
		
		Debug.Log("bang"); // 在控制台输出 "bang" 字符串
	}
}

切枪、设置音效、设置子弹威力、设置子弹时间间隔、换弹

在这里插入图片描述

Button_select():选择不同的枪械。
Button_Fire():开火,根据当前使用的枪械播放对应的音效,并调用castray()方法检测是否打中了僵尸。
pistolfire():手枪的开火逻辑。
tommyfire():冲锋枪的开火逻辑。
riflefire():步枪的开火逻辑。
Button_stopfire():停止持续射击(只有冲锋枪有此功能)。
showbulletsinfo():显示当前使用的枪械的子弹数量。
showtotalbullets():显示所有枪械的总弹药数量。
Canfire():设置canfire变量为true,表示可以开火。
Button_Reload():重新装填当前使用的枪械。
Reload():重新装填指定的枪械。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

// 定义Start1类,继承MonoBehaviour类
public class Start1 : MonoBehaviour
{
// 声明枚举类型Guntype,包含pistol、tommy、rifle三种枪支类型
public enum Guntype{pistol, tommy, rifle}


// 当前使用的枪支类型
public Guntype usinggun;

// 枪支声音源和声音片段数组
public AudioSource gunsource;
public AudioClip[ ] gunclip;

// 是否可以开火的标志位、不同枪支的冷却时间、当前使用的枪支弹药数、弹匣容量、总弹药数和枪支伤害值
public bool canfire = true;
public float []cooltime;
public int[] usinggunbulets;
public int[] clapbullets;
public int[] totalbullets;
public float[] gundamage;

// 显示弹药数的文本和总弹药数文本数组、血液特效预制体
public Text showbullets;
public Text[] totalbulletstext;
public GameObject bloodzone;

// Start方法,初始化当前使用的枪支弹药数
private void Start(){
    usinggunbulets[0] = clapbullets[0];
    usinggunbulets[1] = clapbullets[1];
    usinggunbulets[2] = clapbullets[2];

    // 显示总弹药数
    showtotalbullets();
}

// Update方法,每帧执行一次
// ...

// 开始游戏按钮响应函数
public void startgame()
{
    // 切换到游戏场景
    SceneManager.LoadScene("游戏场景");
}

// 退出游戏按钮响应函数
public void exitgame(){
    // 退出应用程序
    Application.Quit();
}

// 开火按钮响应函数
public void Button_Fire(){
    // 根据当前使用的枪支类型进行开火操作
    switch (usinggun){
        case Guntype.pistol:
            pistolfire();
            break;
        case Guntype.tommy:
            tommyfire();
            break;
        case Guntype.rifle:
            riflefire();
            break;
    }
}

// 手枪开火函数
private void pistolfire(){
    // 如果可以开火且当前弹药数大于0
    if (canfire){
        if (usinggunbulets[(int)Guntype.pistol] > 0){
            // 播放枪声音效,设置开火标志位为false,延迟一段时间后设置为true,减少当前弹药数,显示弹药数信息,进行射线检测
            gunsource.clip = gunclip[0];
            gunsource.Play();
            canfire = false;
            Invoke("Canfire", cooltime[(int)Guntype.pistol]);
            usinggunbulets[(int)Guntype.pistol]--;
            showbulletsinfo((int)Guntype.pistol);
            castray();
        }
    }
}

// 冲锋枪开火函数
private void tommyfire(){
    if (canfire){
        // 播放枪声音效,延迟一段时间后再次调用tommyfire函数进行连发,减少当前弹药数,显示弹药数信息,进行射线检测
        gunsource.clip = gunclip[1];
        gunsource.Play();
        Invoke("tommyfire", cooltime[(int)Guntype.tommy]);
        usinggunbulets[(int)Guntype.tommy]--;
        showbulletsinfo((int)Guntype.tommy);
        castray();
    }
}

// 停止射击按钮响应函数
public void Button_stopfire(){
    if (usinggun == Guntype.tommy){
        // 如果当前使用的是冲锋枪,则设置开火标志位为false,延迟一段时间后设置为true
        canfire = false;
        Invoke("Canfire", 0.3f);
    }
}

// 步枪开火函数
private void riflefire(){
if (canfire){
if (usinggunbulets[(int)Guntype.rifle] == 0)
return;
// 播放枪声音效,设置开火标志位为false,延迟一段时间后设置为true,减少当前弹药数,显示弹药数信息,进行射线检测
gunsource.clip = gunclip[2];
gunsource.Play();
canfire = false;
Invoke("Canfire", cooltime[(int)Guntype.rifle]);
usinggunbulets[(int)Guntype.rifle]--;
showbulletsinfo((int)Guntype.rifle);
castray();
}
}

clojure
Copy
// 选择枪支按钮响应函数
public void Button_select(int gunid){
    // 根据选择的枪支id设置当前使用的枪支类型,并显示弹药数信息
    switch(gunid){
        case 0:
            usinggun = Guntype.pistol;
            showbulletsinfo((int)Guntype.pistol);
            break;
        case 1:
            usinggun = Guntype.tommy;
            showbulletsinfo((int)Guntype.tommy);
            break;
        case 2:
            usinggun = Guntype.rifle;
            showbulletsinfo((int)Guntype.rifle);
            break;
        default :
            break;
    }
}

// 显示当前枪支弹药数信息
private void showbulletsinfo(int gunid){
    showbullets.text = usinggunbulets[gunid].ToString() + "/" + clapbullets[gunid];
}

// 显示总弹药数信息
private void showtotalbullets(){
    totalbulletstext[0].text = totalbullets[0].ToString();
    totalbulletstext[1].text = totalbullets[1].ToString();
    totalbulletstext[2].text = totalbullets[2].ToString();
}

// 设置开火标志位为true的函数
private void Canfire(){
    canfire = true;
}

// 重新装填按钮响应函数
public void Button_Reload(){
    // 根据当前使用的枪支id执行重新装填操作
    Reload((int)usinggun);
}

// 重新装填函数
public void Reload(int gunid){
    // 计算需要重新装填的弹药数,如果总弹药数足够,则重新装填弹药,否则只装填剩余的总弹药数,同时更新显示的弹药数信息和总弹药数信息
    int cout = clapbullets[gunid] - usinggunbulets[gunid];
    if (cout <= totalbullets[gunid]){
        usinggunbulets[gunid] = clapbullets[gunid];
        totalbullets[gunid] -= cout;
    }
    else{
        totalbullets[gunid] += totalbullets[gunid];
        totalbullets[gunid] = 0;
    }
    showbulletsinfo(gunid);
    showtotalbullets();
}

// 射线检测函数,检测是否射中了敌人
private void castray(){
    Vector2 v = new Vector2 (Screen.width/2, Screen.height/2);
    RaycastHit hit;
    if (Physics.Raycast(Camera.main.ScreenPointToRay(v), out hit)){
        if (hit.transform.root.CompareTag("zombie")){
            // 如果射中了敌人,则播放血液特效并造成伤害
            bloodzone.SetActive(true);
            var zombie = hit.transform.root.GetComponent<health>();
            if (hit.transform.name == "Bip001 Pelvis"){
                zombie.getdamage(gundamage[(int)usinggun]);
            }
            else{
                zombie.getdamage(gundamage[(int)usinggun] * 3);
            }
        }
        else{
            // 如果没有射中敌人,则隐藏血液特效
            bloodzone.SetActive(false);
        }
    }
}
}

准星控制射击

在这里插入图片描述

private void castray(){
    Vector2 v = new Vector2(Screen.width/2,Screen.height/2); // 创建一个屏幕中心点的 2D 向量 v
    RaycastHit hit; // 创建一个 RaycastHit 变量用于接收射线的碰撞结果
    
    if (Physics.Raycast(Camera.main.ScreenPointToRay(v), out hit)) // 从相机发出一条射线,通过屏幕中心点 v,检测是否与物体发生碰撞,并将结果保存在 hit 变量中
    {
        if (hit.transform.root.CompareTag("zombie")) // 如果射线碰撞的物体的根节点标签是 "zombie"
        {
            bloodzone.SetActive(true); // 激活一个名为 "bloodzone" 的游戏对象

            var zombie = hit.transform.root.GetComponent<health>(); // 获取射线碰撞物体的根节点上的 health 组件,赋值给 zombie 变量

            if (hit.transform.name == "Bip001 Pelvis") // 如果射线碰撞到的物体的名字是 "Bip001 Pelvis"
            {
                zombie.getdamage(gundamage[(int)usinggun]); // 调用 zombie 的 getdamage 方法,并传入 usinggun 变量对应的 gundamage 值作为参数
            }
            else
            {
                zombie.getdamage(gundamage[(int)usinggun] * 3); // 否则,调用 zombie 的 getdamage 方法,并传入 usinggun 变量对应的 gundamage 值乘以 3 作为参数
            }
        }
        else
        {
            bloodzone.SetActive(false); // 如果射线碰撞的物体不是 "zombie",则关闭 "bloodzone" 对象
        }
    }
}

这段代码的作用是进行射线检测,判断射线是否与名为 “zombie” 的物体发生碰撞。如果发生碰撞,则激活名为 “bloodzone” 的游戏对象,并根据射线碰撞的具体位置和物体的名称,调用相应的伤害方法。如果没有发生碰撞或者射线碰撞的物体不是 “zombie”,则关闭 “bloodzone” 对象。


僵尸动画、血条

在这里插入图片描述

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

public class health : MonoBehaviour
{
    public float hitpot;  // 角色的当前生命值
    public float maxpot = 100f;  // 角色的最大生命值
    public Slider blood;  // 血条UI元素
    public player player;  // player脚本的引用
    public zombie zom;  // zombie脚本的引用

    public Sprite headcon;  // 头像图标的Sprite
    public Image headimage;  // 头像UI元素的Image组件

    void Start()
    {
        hitpot = maxpot;  // 设置初始生命值为最大生命值
        blood.maxValue = maxpot;  // 设置血条的最大值为最大生命值
        blood.value = maxpot;  // 设置血条的当前值为最大生命值
        blood.gameObject.SetActive(false);  // 隐藏血条
        headimage.gameObject.SetActive(false);  // 隐藏头像
    }

    void Update()
    {
        if (zom.agent.enabled)
        {
            zom.agent.SetDestination(zom.player.position);  // 设置僵尸的目标位置为玩家的位置
        }
        if (Vector3.Distance(zom.transform.position, zom.player.position) <= 1.8)
        {
            zom.zombieanimator.SetBool("attack", true);  // 设置僵尸的攻击动画为true
        }
        else
        {
            zom.zombieanimator.SetBool("attack", false);  // 设置僵尸的攻击动画为false
            zom.zombieanimator.SetBool("walk", true);  // 设置僵尸的行走动画为true
        }
    }

    public void getdamage(float dam)
    {
        blood.gameObject.SetActive(true);  // 显示血条
        headimage.gameObject.SetActive(true);  // 显示头像

        headimage.sprite = headcon;  // 设置头像图标为指定的Sprite

        hitpot -= dam;  // 减去受到的伤害值
        blood.value = hitpot;  // 更新血条的当前值为剩余生命值

        if (hitpot <= 0)
        {
            GetComponent<Animator>().SetBool("dead", true);  // 设置角色的死亡动画为true
            zom.agent.enabled = false;  // 禁用僵尸的导航代理
        }
    }
}


设置导航

在这里插入图片描述

 void Update()
    {
        if (zom.agent.enabled)
        {
            zom.agent.SetDestination(zom.player.position);  // 设置僵尸的目标位置为玩家的位置
        }
        if (Vector3.Distance(zom.transform.position, zom.player.position) <= 1.8)
        {
            zom.zombieanimator.SetBool("attack", true);  // 设置僵尸的攻击动画为true
        }
        else
        {
            zom.zombieanimator.SetBool("attack", false);  // 设置僵尸的攻击动画为false
            zom.zombieanimator.SetBool("walk", true);  // 设置僵尸的行走动画为true
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度智能车竞赛丝绸之路1——智能车设计与编程实现控制

百度智能车竞赛丝绸之路1——智能车设计与编程实现控制 百度智能车竞赛丝绸之路2——手柄控制 一、项目简介 本项目现已基于鲸鱼机器人开发套件对其整体外形进行设计&#xff0c;并且对应于实习内容——以“丝绸之路”为题&#xff0c;对机器人各个功能与机器人结构部分进行相…

【几何数学】【Python】【C++】判断两条线段是否相交,若相交则求出交点坐标

判断线段是否相交的办法&#xff08;使用了向量叉积的方法&#xff09;&#xff1a; 首先&#xff0c;通过给定的线段端点坐标p1、p2、p3和p4构建了四个向量v1、v2、v3和v4&#xff1a; v1表示从p1指向p2的向量&#xff0c;其分量为[p2[0] - p1[0], p2[1] - p1[1]]。 v2表示从…

Camtasia Studio2023标准版屏幕录制和视频剪辑软件

Camtasia Studio2023提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等。它能在任何颜色模式下轻松地记录屏幕动作&#xff0c;包括影像、音效、鼠标移动的轨迹&#xff0c;解说声音等等&#xff0c;另外&#xff0c;它还具有及时播放和编辑压缩…

[前端]JS——join()与split()的使用

Array.join():数组转换为字符串,"()"里元素指定数组转为字符串用什么串联&#xff0c;默认为空。 Array.join()的使用&#xff1a; <script>let arr[1,2,3,4]console.log("arr未转换前:",arr,typeof(arr));console.log("arr使用join():"…

Netty核心技术八--Netty编解码器和handler的调用机制

1.基本说明 netty的组件设计&#xff1a;Netty的主要组件有Channel、EventLoop、ChannelFuture、 ChannelHandler、ChannelPipe等 ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器。 例如&#xff0c;实现ChannelInboundHandler接口&#xff08;或ChannelInbound…

Typora图床配置-OSS对象存储

Typora图床配置-OSS对象存储 1.PicGo下载 下载地址&#xff1a; Release 2.3.0 Molunerfinn/PicGo GitHub https://github.com/Molunerfinn/PicGo/releases/tag/v2.3.1 下载如下&#xff1a; 2.安装和配置 进入阿里云创建OSS对象存储服务。 设置为公共读才能被别人访问到。…

树与图的深度优先遍历

树的重心 本题的本质是树的dfs&#xff0c; 每次dfs可以确定以u为重心的最大连通块的节点数&#xff0c;并且更新一下ans。 也就是说&#xff0c;dfs并不直接返回答案&#xff0c;而是在每次更新中迭代一次答案。 这样的套路会经常用到&#xff0c;在 树的dfs 题目中 #includ…

IMU 互补滤波

IMU学名惯性测量单元&#xff0c;所有的运动都可以分解为一个直线运动和一个旋转运动&#xff0c;故这个惯性测量单元就是测量这两种运动&#xff0c;直线运动通过加速度计可以测量&#xff0c;旋转运动则通过陀螺。 void IMUupdate(float gx, float gy, float gz, float ax,fl…

Go 语言 context 都能做什么?

原文链接&#xff1a; Go 语言 context 都能做什么&#xff1f; 很多 Go 项目的源码&#xff0c;在读的过程中会发现一个很常见的参数 ctx&#xff0c;而且基本都是作为函数的第一个参数。 为什么要这么写呢&#xff1f;这个参数到底有什么用呢&#xff1f;带着这样的疑问&am…

postgresql数据库登录代理解析(包含登录协议包解析)

文章目录 postgresql数据库登录代理解析&#xff08;包含登录协议包解析&#xff09;背景描述版本不同对应的账号密码加密目标解析方法相关代码位置断点关键位置及相关重要变量 登录通信流程&#xff08;SCRAM-SHA-256方式&#xff09;代码实现相关参考资料 postgresql数据库登…

Python count()函数详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 count 1、指定搜索位置2、参数为负数3、列表的coun…

以太网OSI参考模型(四)

目录 OSI模型 一、物理层 二、数据链路层 三、网络层 四、传输层 五、会话层 六、表示层 七、应用层 OSI模型 OSI七层模型&#xff0c;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)1984年联合制定的开放系统互联参考模型&#xff0c;为开放式互联信息系统提供…

06-C++学习笔记-指针的定义与使用

指针是C中非常重要的概念&#xff0c;它允许直接访问内存地址&#xff0c;并通过地址操作变量。本篇笔记将介绍指针的定义与使用方法&#xff0c;以及指针与数组的关系。 1️⃣ 指针的引入 指针的引入是为了解决需要直接访问内存地址的情况。通过指针&#xff0c;可以间接访问…

Android TextView 展示特殊字符高度变高问题解决

背景 #在我们的项目中&#xff0c;展示文字是很常见的需求&#xff0c;但是在线上展示中发现&#xff0c;有些信息是特殊字符展示的&#xff0c;而且这些字符的高度会导致TextView的高度变高&#xff08;与正常字符比&#xff09;。 效果如下&#xff1a; 很明显&#xff0…

森云+优控配置摄像头进行录像和拍照测试

森云和优控配置摄像头进行录像和拍照测试 现在其实已经基本上明确自己的环境了&#xff0c;就是在ubuntu下的pycharm和vscode&#xff0c;然后下载conda&#xff08;但是不要默认的base环境&#xff0c;只要conda create -n xxx 这样的基本功能就好了&#xff09; 显示opencv…

AI绘画StableDiffusion:云端在线版使用笔记分享(Kaggle版)

玩AI绘画&#xff08;SD&#xff09;&#xff0c;自己电脑配置不够&#xff1f;今天给大家介绍一下如何baipiao在线版AI绘画StableDiffusion。 Kaggle 是世界上最大的数据科学社区&#xff0c;拥有强大的工具和资源&#xff0c;可帮助您实现数据科学目标。&#xff08;每周可以…

【MySQL学习笔记】(六)MySQL基本查询

表的增删查改 1 create1.1 单行数据全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2 retrieve2.1 select列2.1.1 全列查询2.2.2 指定列查询2.2.3 查询字段为表达式2.2.4 为查询结果指定别名2.2.5 结果去重 2.2 where 条件2.2.1 null的查询 2.3 结果排序2.4 筛选分…

如何搭建一个实时对话转录应用(类似zoom中的文本转录功能)并部署到 Heroku

文章目录 应用搭建Assembly AI文件夹结构前端搭建HTMLindex.js 后端搭建server.jspackage.json Heroku 部署创建账号创建Heroku应用上传仓库 应用搭建 应用基于 html javascript使用的第三方 API 是 Assembly AI 提供的 Assembly AI 要使用 real-time transcript 功能&…

ChatGPT:为教育创新提供五大机遇

随着智能技术的不断发展&#xff0c;ChatGPT在教育场景中的创新价值可能比我们能够意识到的还要多。比如它可以自动处理作业、在线答疑&#xff0c;可以辅助语言学习、实时沟通&#xff0c;甚至还可以用于评估诊断、科学研究。国内外关于利用ChatGPT实现教育创新的场景描绘已经…

【Matplotlib】多级雷达图绘制

一、实例1&#xff1a;个人能力画像雷达图 # -*- coding: utf-8 -*- """ Created on Sat Jul 1 20:52:54 2023author: zcq """import numpy as np import matplotlib.pyplot as plt import matplotlibmatplotlib.rcParams[font.family]SimHei …