RPG项目01_脚本代码

基于“RPG项目01_场景及人物动画管理器”,我们创建一个XML文档

在资源文件夹下创建一个文件夹,

命名为Xml

将Xnl文档拖拽至文件夹中,

再在文件夹的Manager下新建脚本LoadManager

写代码:

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

public class LoadManager 
{
    public static AudioClip LoadAudio(string str) {
        AudioClip clip = Resources.Load<AudioClip>("Audio/" + str);
        return clip;
    }
    public static GameObject LoadGameObject(string str)
    {
        GameObject obj = Resources.Load<GameObject>("Prefab/" + str);
        return obj;
    }
    public static Sprite LoadSprite(string str)
    {
        Sprite sprite = Resources.Load<Sprite>("Pic/" + str);
        return sprite;
    }
    public static TextAsset LoadXml(string str)
    {
        TextAsset t = Resources.Load<TextAsset>("Xml/" + str);
        return t;
    }
}
继续在Manager文件夹下创建脚本

新建GameManager脚本:

using System.Collections.Generic;
using System.Xml;
using Unity.VisualScripting;
using UnityEngine;
public enum GameState { Play, Menu };
public class GameManager{
    //当只需要一个的时候使用静态类
    public static GameState gameState = GameState.Play; 
    public static void Init()
    {
        //SetGoods();
    }
    public static T FindType<T>(Transform t, string n)
    {
        return t.Find(n).GetComponent<T>();
    }
    public static T ParseEnum<T>(string value)
    {
        return (T)System.Enum.Parse(typeof(T), value, true);
    }
}
继续在Manager文件夹下创建脚本

写代码:

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

public class MainGame : MonoBehaviour
{
    public static Transform canvas;
    private void Awake()
    {
        GameManager.Init();
        canvas = transform;
    }
}
再在Scripts脚本文件夹下新建文件夹命名为:Living(活着的生物)

在Living创建基类People(狼人也是人)

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

public class People : MonoBehaviour{
    
}
再创建两个子类:

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

public class MyPlayer : People
{
    
}

第二个子类

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

public class Enemy : People
{
    
}
重新修改MainGame代码:

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

public class MainGame : MonoBehaviour
{
    public static Transform canvas;
    public static MyPlayer player;
    private void Awake()
    {
        GameManager.Init();
        player = GameObject.Find("Player").GetComponent<MyPlayer>();    
        canvas = transform;
    }
}

接下来挂载脚本:

再挂载人物脚本:

新建脚本文件夹Data

新建脚本DataObject

写代码(数据类:为角色提供数据):

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

public class DataObject : MonoBehaviour 

    public string _name;
    public int hp = 100;
    public int mp = 100;
    public int hpMax = 100;
    public int mpMax = 100;
    public int lv;
    [Header("速度:")]
    public float spd = 3;
    [Header("攻击:")]
    public int att;
    [Header("防御:")]
    public int def;
    [Header("魔抗:")]
    public int mdf;
    [Header("经验价值:")]
    public int expValue;
    [Header("金钱价值:")]
    public int goldValue;
    [Header("攻击力稳定值:")]
    public int randomAtk;
}
将DataObject脚本挂载到Player人物上

运行

在文件夹下创建SkillBase

写代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public enum SkillType { Up, Magic, Physics };

public class SkillBase : MonoBehaviour
{
    
}
修改People代码:

using System.Collections.Generic;
using UnityEngine;
public class People : MonoBehaviour{
    //等价知识点:1 = 2
    //1.public int Num { get; }
    //------------------------------
    //2.int num;
    //  public int Num(){
    //      return num;
    //  }
    public DataObject data;
    public int Hp {
        protected set { 
            data.hp = value;
        }
        get {
            return Mathf.Clamp(data.hp, 0, HpMax);
        }
    }
    public int HpMax {
        protected set {
            data.hpMax = value;
        }
        get {
            return data.hpMax + OffsetHp;
        }
    }
    public int Mp
    {
        protected set
        {
            data.mp = value;
        }
        get
        {
            return Mathf.Clamp(data.mp, 0, MpMax);
        }
    }
    public int MpMax
    {
        protected set
        {
            data.mpMax = value;
        }
        get
        {
            return data.mpMax + OffsetMp;
        }
    }
    public float Spd {
        protected set { 
            data.spd = value;
        }
        get {
            return data.spd + OffsetSpd;
        }
    }
    public int Att
    {
        protected set
        {
            data.att = value;
        }
        get
        {
            return (int)(data.att * GetRandomRate()) + OffsetAtt;
        }
    }
    public int Def
    {
        protected set
        {
            data.def = value;
        }
        get
        {
            return data.def + OffsetDef;
        }
    }
    public int Mdf
    {
        protected set
        {
            data.mdf = value;
        }
        get
        {
            return data.mdf + OffsetMdf;
        }

    }
    public int lv
    {
        protected set => data.lv = value;
        get => data.lv;
    }
    public int Exp { set; get; }
    public bool IsDeath { set; get; }
    public People Target { get; set; }
    public Animator Anim { get; set; }

    protected int OffsetHp { set; get; }
    protected int OffsetMp { set; get; }
    protected int OffsetSpd { set; get; }
    protected int OffsetAtt { set; get; }
    protected int OffsetDef { set; get; }
    protected int OffsetMdf { set; get; }

    public Transform attPoint;
    public delegate void Fun(People p);
    protected event Fun Dead;
    protected Dictionary<int, SkillBase> skills = new Dictionary<int, SkillBase>();

    #region 初始化
    protected virtual void InitValue()
    {
        Anim = GetComponent<Animator>();
        data = GetComponent<DataObject>();
        Dead = Death;
    }
    protected virtual void InitSkill()
    {

    }
    #endregion

    #region 事件
    public void AddEventHandle(Fun funback)
    {
        Dead += funback;
    }
    public void RemoveEventHandle(Fun funback)
    {
        Dead -= funback;
    }
    protected virtual void Death(People p)
    {
        IsDeath = true;
        Anim.SetTrigger("IsDeath");
        p.Victory(this);
        Invoke("Over", 5);
    }
    protected virtual void Victory(People p)
    {

    }
    protected void Over()
    {
        print("over");
    }
    #endregion

    #region 战斗伤害
    protected float GetRandomRate()
    {
        return (Random.Range(-data.randomAtk, data.randomAtk + 1) + 100) * 0.01f;
    }

    public virtual void BePhysicsHit(int value, People p)
    {
        if (IsDeath)
        {
            return;
        }
        Hp -= value - Def;
        UpdateUI();
        if (Hp <= 0)
        {
            Dead(p);
        }
    }
    public virtual void BeMagicHit(int value, People p)
    {
        if (IsDeath)
        {
            return;
        }
        Hp -= value - Mdf;
        UpdateUI();
        if (Hp <= 0)
        {
            Dead(p);
        }
    }
    #endregion


    #region Hp/Mp
    public virtual void AddHp(int value)
    {
        Hp += value;
        UpdateUI();
    }
    public virtual void AddMp(int value)
    {
        Mp += value;
        UpdateUI();
    }

    public float GetHpRation()
    {
        return (float)Hp / HpMax;
    }
    #endregion
    protected void Start()
    {
        InitSkill();
        InitValue();
    }
    protected virtual void UpdateUI()
    {

    }
}
知识点:Image的冷却填充作用

创建两个Image父子物体:

将父物体放置一个图片,

对子物体添加一个半透明画面

调节子物体颜色及半透明度

类型选择为填充Fill

调节即可制作冷却

知识点结束,可以把Image删了

修改MyPlayer脚本代码:

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

public class MyPlayer : People
{
    [Header("==============子类变量==============")]
    public Transform toolPanel;
    new void Start() {
        base.Start();
    }
    private void Update()
    {
        
    }
}
在Living脚本文件夹下新建脚本CameraCtrl

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

public class CameraCtrl : MonoBehaviour
{
    public float dis;
    public float height;
    public float speed;
    Transform target;
    Vector3 targetPos;
    // Start is called before the first frame update
    void Start()
    {
        target = MainGame.player.transform;
    }

    // Update is called once per frame
    void Update()
    {
        transform.LookAt(target.position + Vector3.up * 1.5f);
        targetPos = target.forward * (-dis) + target.up * height + target.position;
    }
    private void LateUpdate()
    {
        transform.position = Vector3.Lerp(transform.position, targetPos, speed);
    }
}
更新MyPlayer代码:

         

再将CameraCtrl摄像机跟随代码挂载在Camera摄像机上

调节CameraCtrl数值后运行

如果不想运行时摄像机千里跟随,就可以将角色的位置复制给摄像机:

最后设置一下设摄像机的y轴调高一点

完成阶段代码


 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7、Qt延时的使用

一、说明 平时用到两种延时方式QThread::sleep()和QTimer::singleShot() 1、QThread::sleep() QThread类中如下三个静态函数&#xff1a; QThread::sleep(n); //延迟n秒 QThread::msleep(n); //延迟n毫秒 QThread::usleep(n); //延迟n微妙 这种方式使用简单&#xff0c;但是会阻…

四.多表查询

多表查询 1.一个案例引发的多表连接1.1案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3案例分析与问题解决 2.多表查询分类讲解分类1&#xff1a;等值连接vs非等值连接分类2&#xff1a;自连接vs非自连接分类3&#xff1a;内连接vs外连接 3.SQL99语法实现多表…

【【FPGA 之 MicroBlaze XADC 实验】】

FPGA 之 MicroBlaze XADC 实验 Vivado IP 核提供了 XADC 软核&#xff0c;XADC 包含两个模数转换器&#xff08;ADC&#xff09;&#xff0c;一个模拟多路复用器&#xff0c;片上温度和片上电压传感器等。我们可以利用这个模块监测芯片温度和供电电压&#xff0c;也可以用来测…

在AWS Lambda上部署标准FFmpeg工具——自定义层的方案

大纲 1 确定Lambda运行时环境1.1 Lambda系统、镜像、内核版本1.2 运行时1.2.1 Python1.2.2 Java 2 打包FFmpeg3 创建Lambda的Layer4 测试4.1 创建Lambda函数4.2 附加FFmpeg层4.3 添加测试代码4.4 运行测试 参考文献 FFmpeg被广泛应用于音/视频流处理领域。对于简单的需求&#…

sizeof()、strlen()、length()、size()的区别(笔记)

​ 上面的笔记有点简陋&#xff0c;可以看一下下面这个博主的&#xff1a; c/c中sizeof()、strlen()、length()、size()详解和区别_csize,sizeof,length_xuechanba的博客-CSDN博客

Linux Docker 图形化工具 Portainer远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 结束语 前言 Portainer是一个轻量级的容器管理工具&#xff0c;可以通过Web界面对Docker容器进行管理和监控。它提供了…

Kafka中的Topic

在Kafka中&#xff0c;Topic是消息的逻辑容器&#xff0c;用于组织和分类消息。本文将深入探讨Kafka Topic的各个方面&#xff0c;包括创建、配置、生产者和消费者&#xff0c;以及一些实际应用中的示例代码。 1. 介绍 在Kafka中&#xff0c;Topic是消息的逻辑通道&#xff0…

LeetCode-478. 在圆内随机生成点【几何 数学 拒绝采样 随机化】

LeetCode-478. 在圆内随机生成点【几何 数学 拒绝采样 随机化】 题目描述&#xff1a;解题思路一&#xff1a;一个最简单的方法就是在一个正方形内生成随机采样的点&#xff0c;然后拒绝不在内切圆中的采样点。解题思路二&#xff1a;具体思想是先生成一个0到r的随机数len&…

加强网站稳定性!学习如何进行高效压力测试!

前言 1、什么是压力测试&#xff1f; 软件压力测试是一种基本的质量保证行为&#xff0c;它是每个重要软件测试工作的一部分。 软件压力测试的基本思路很简单&#xff1a;不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试…

k8s之镜像拉取时使用secret

k8s之secret使用 一、说明二、secret使用2.1 secret类型2.2 创建secret2.3 配置secret 一、说明 从公司搭建的网站镜像仓库&#xff0c;使用k8s部署服务时拉取镜像失败&#xff0c;显示未授权&#xff1a; 需要在拉取镜像时添加认证信息. 关于secret信息,参考: https://www.…

AntDesignBlazor示例——创建项目

本示例是AntDesign Blazor的入门示例&#xff0c;在学习的同时分享出来&#xff0c;以供新手参考。 示例代码仓库&#xff1a;https://gitee.com/known/AntDesignDemo 1. 开发环境 VS2022 17.8.2.NET8AntDesign 0.16.2 2. 学习目标 创建新项目安装AntDesign组件包及使用方…

2D与3D图形的基本变换

1. 2d transformations 1.1缩放(Scaling) 其实这个转换非常简单&#xff0c;如图所示就是把x与y进行s倍的缩放&#xff0c;而我们图中的这个矩阵正好满足这一算法。 1.2镜像(Reflection) 这个镜像变换可以和上面的做类比&#xff0c;简单看一下就行。 1.3错切(Shearing) 当然…

《数据结构、算法与应用C++语言描述》-线索二叉树的定义与C++实现

_23Threaded BinaryTree 可编译运行代码见&#xff1a;GIithub::Data-Structures-Algorithms-and-Applications/_24Threaded_BinaryTree 线索二叉树定义 在普通二叉树中&#xff0c;有很多nullptr指针被浪费了&#xff0c;可以将其利用起来。 首先我们要来看看这空指针有多少…

单片机怎么实现真正的多线程?

单片机怎么实现真正的多线程? 不考虑多核情况时&#xff0c;CPU在一个时间点只能做一件事&#xff0c;因为切换的速度快所以看起来好像是同时执行多个线程而已。 实际上就是用定时器来做时基&#xff0c;以时间片的方式分别执行来实现的&#xff0c;只不过实现起来细节比较复…

C语言--每日选择题--Day37

第一题 1. 有以下说明语句&#xff1a;则下面引用形式错误的是&#xff08;&#xff09; struct Student {int num;double score; };struct Student stu[3] {{1001,80}, {1002,75}, {1003,91}} struct Student *p stu; A&#xff1a;p->num B&#xff1a;(p).num C&#…

LeetCode:2477. 到达首都的最少油耗(DFS C++、Java)

目录 2477. 到达首都的最少油耗 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 2477. 到达首都的最少油耗 题目描述&#xff1a; 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n…

1-4节电池升降压充电IC解决方案

描述 MP2760是一款集成窄电压DC&#xff08;NVDC&#xff09;电源路径管理功能和USB On-the-Go(OTG)功能的升降压充电IC&#xff0c;兼容USB PD&#xff0c;适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广&#xff0c;可支持最高22V。 当启用电池放电模式&…

线性可分SVM摘记

线性可分SVM摘记 0. 线性可分1. 训练样本到分类面的距离2. 函数间隔和几何间隔、(硬)间隔最大化3. 支持向量 \qquad 线性可分的支持向量机是一种二分类模型&#xff0c;支持向量机通过核技巧可以成为非线性分类器。本文主要分析了线性可分的支持向量机模型&#xff0c;主要取自…

企业级SQL开发:如何审核发布到生产环境的SQL性能

自从上世纪 70 年代数据库开始普及以来&#xff0c;DBA 们就不停地遭遇各种各样的数据库管理难题&#xff0c;其中最为显著的&#xff0c;可能就是日常的开发任务中&#xff0c;研发人员们对于核心库进行变更带来的一系列风险。由于针对数据库的数据变更是一项非常常见的任务&a…

对抗生成网络-G与D的loss异常问题

我最近在**使用DCGAN训练个人的数据集**时&#xff0c;出现了D loss 下降趋于0&#xff0c;但是G loss 却不停上升。我总结了一下几点原因&#xff1a; 生成器损失为1或者大于1通常表明生成器的训练可能存在问题&#xff0c;这可能是由于训练不稳定、超参数设置不当或网络结构问…