【GamePlay】入门篇

【GamePlay】入门篇

游戏性编程是指通过一系列游戏系统将游戏想法变成现实的过程。

本次的简例以NPC设计为主。

通常在进行脚本设计前,对NPC的属性进行基本的添加和设定,诸如动画系统、物理系统等等。

1.动画系统

添加Animator组件,绑定骨骼。

创建Animator Controller文件,将之添加到组件的Controller部分。

打开Controller,考虑动画组件的主体需要实现什么功能。

以此例的NPC为例,需要实现他的移动功能。

所以在Controller中添加新的混合树命名为Locomotion(移动)。

打开混合树,为其添加三种不同的运动状态(空闲、走路、奔跑),并绑定相应的动画文件。

调整三个状态之间的数值阶段,初始为0:0.5:1,调整为0:1:8。

(这里的意义在于更流畅的移动体验,休闲到走路快速的过渡,走路到奔跑则需要速度到达一定阈值后才能切换。)

备注:

取消勾选Autonate Thresholds后,可以更改数值。

parameter是用于脚本中调用setFloat方法中的参数名,从而在动画间不断的切换。

【2】Player脚本

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovement : MonoBehaviour
{public float moveSpeed;private Vector3 moveInput;private Vector3 moveVelocity;private Rigidbody rd;private Camera mainCamera;private Animator animator;// Start is called before the first frame updatevoid Start(){rd = GetComponent<Rigidbody>();mainCamera = Camera.main;animator = GetComponent<Animator>();}// Update is called once per framevoid Update(){float lh = Input.GetAxis("Horizontal");//输入的是左右,即X轴数据,对应着AD键位。float lv = Input.GetAxis("Vertical");//输入的是上下,即Z轴的数据,对应着WS键位。
       moveInput =new Vector3(lh,0f,lv);//一个即时的向量,当无输入时是零向量。//在Unity中,人物面朝的方向是蓝轴,即Z轴;沿着人物双手方向的横轴是红轴,即X轴;||而沿着人物垂心的是绿轴,即Y轴。Vector3 cameraForword = mainCamera.transform.forward;//主相机在沿着z轴的矢量位置和方向
        cameraForword.y = 0;Quaternion s = Quaternion.FromToRotation(Vector3.forward, cameraForword);//这个四元素包含了(0,0,1)到cameraForword的旋转信息
        Vector3 lookToward = s * moveInput;//四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量。if (moveInput.sqrMagnitude>0){Ray ray = new Ray(transform.position,lookToward);//transform.position为该脚本对应的对象的位置
           transform.LookAt(ray.GetPoint(1));//transform.LookAt:旋转自身,使得当前对象的正z轴指向目标对象target所在的位置(使对象朝向目标点)//ray.GetPoint(1):获取一个沿着向量方向距离X的点
        }moveVelocity = transform.forward*moveSpeed* moveInput.sqrMagnitude;//transform.forward给的是人物坐标轴Z轴的矢量方向,即面朝的方向//(自动对物体旋转值算出前进方向向量的变量,vector3.forward则不计算旋转值,所以vector3.forward固定为(0,0,1))//moveVector3.sqrMagnitude返回是坐标轴输入矢量的平方长度的Float数值,用于控制速度,当无输入时,速度为0。
        Aniamting();}void FixedUpdate(){rd.velocity = moveVelocity;}void Aniamting(){animator.SetFloat("Blend",rd.velocity.magnitude);//调用animator.SetFloat方法,可以设置混合树中的参数数值,参数名字以自定义的参数名为准
    }
}

 【3】scriptableobject(Unity中用于处理序列化的结构)

一个允许你存储大量独立于脚本实例的共享数据的类。

目的是通过避免对值进行复制而减少内存的开销。

定义了一个继承自ScriptableObject的类,你可以使用CreateAssetMenu attribute用你的类创建自定义assets。

下面为实例:

Player加载的类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CharacterStats : MonoBehaviour
{//Stats:一个统计玩家数据的类#region MyRegion//#region 是 C# 预处理器指令。 #region 是一个分块预处理命令,它主要是用于编辑器代码的分块,在编译时会被自动删除。//#region 在使用 Visual Studio 代码编辑器的大纲显示功能时指定可展开或折叠的代码块。有助于代码的整洁。//
    public static CharacterStats instance;void Awake(){instance = this;//传递自身的地址}#endregionpublic int MaxHealth = 100;public int CurrentHealth { get; private set; }//可以公共获取,但只能在该类中设置。void Start(){CurrentHealth = MaxHealth;}public void takeDamage(int damage){CurrentHealth -= damage;if (CurrentHealth <= 0){Dead();}}public void TreatHealth(int treat){print("treat:"+treat);CurrentHealth += treat;print(CurrentHealth);if (CurrentHealth >= 100){print("你恢复了健康");}}public void Dead(){print("You Dead");}}

互动对象体加载的类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ItemPickUp : Interacrable
{//继承自Interacrable类(含有与环境互动的代码)public Itemss item;CharacterStats charStatss=new CharacterStats();public override void Interact()//重写了父类的方法,并搭载的自己的内容{base.Interact();PickUp();}void PickUp(){item.Use();//这里使用的派生类的基类,但实际上传递的是根据Item基类自定义的assets。
        Destroy(gameObject);}
}

以下是相关的类,并未直接加载到对象上:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu(fileName = " NewItems",menuName = "Inventory/Item")]public class Itemss : ScriptableObject
{//创建assets的基类new public string name = "Item";public Sprite icon = null;public virtual void Use(){}
}

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "New Health Potion",menuName = "Inventory/Item/Health Potion")]
public class HealthPotion : Itemss
{//继承自Item类的子类,是assets新的蓝本。public int HealthModifity;private CharacterStats charStats;void Start(){charStats=CharacterStats.instance;}public override void Use(){base.Use();ApplyEffect();}void ApplyEffect(){CharacterStats.instance.TreatHealth(HealthModifity);//传递了玩家参数类的方法。
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Interacrable : MonoBehaviour
{//包含玩家与环境互动的类public bool interacting = false;private Renderer rend;public Material[] materials;void Start(){rend = GetComponent<Renderer>();rend.enabled=true;//启用渲染器,使渲染的对象可见rend.sharedMaterial = materials[0];//Renderer.sharedMaterial:修改模型材质的颜色,或者是修改材质Shader的一些属性。//(此方法使用的材料是共享的材料,内存中只有一份,不建议对材料做修改)
    }void Update(){if (interacting&&Input.GetKeyDown(KeyCode.Alpha1)){Interact();}if (interacting){rend.sharedMaterial = materials[1];}else{rend.sharedMaterial = materials[0];}}public virtual  void Interact(){//虚方法,子类可加Override进行重写,虚方法本身有方法体。
        Destroy(gameObject);}void OnTriggerEnter(Collider other){if (other.gameObject.tag == "Player"){interacting = true;}}void OnTriggerExit(Collider other){if (other.gameObject.tag == "Player"){interacting = false;}}
}

 

posted on 2019-07-03 20:27 青先生 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/Mr-QingZi/p/11128829.html

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

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

相关文章

vue axios POST请求中参数以form data和request payload形式的原因

HTTP请求中&#xff0c;如果是get请求&#xff0c;那么表单参数以namevalue&name1value1的形式附到url的后面&#xff0c;如果是post请求&#xff0c;那么表单参数是在请求体中&#xff0c;也是以namevalue&name1value1的形式在请求体中。通过chrome的开发者工具可以看…

vue-resource使用

vue-resource是一个http请求插件&#xff0c;遵循promise&#xff0c;类似jquery中ajax操作。 vue-resource已不被官方推荐&#xff0c;官方推荐axios插件来操作http协议。 vue-resource中提供的方法 get(url, [options]) head(url, [options]) delete(url, [options]) jso…

HttpHttps

http协议与https Http 客户端发送一个HTTP请求到服务器的请求消息包括以下格式&#xff1a; **请求行&#xff08;request line&#xff09;、请求头部&#xff08;header&#xff09;、空行 和请求数据四个部分组成。** Get请求例子&#xff0c;使用Charles抓取的request&…

vue2使用axios post跳坑,封装成模块

终于将vue-resource替换成axios了&#xff0c;其中像application/x-www-form-urlencoded发送的头信息以及返回的response结果这两点都需要注意一下。 其实https://github.com/mzabriskie/axios也有说明的。因为我在vue-resource中使用了Vue.http.options.emulateJSON true;&am…

axios使用

axios和vue-resource一样&#xff0c;是一个vue中操作http的插件&#xff0c;遵循promise&#xff0c;vue官方也推荐使用axios。 安装axios npm i axios -S axios也是在运行时需要的&#xff0c;所以要保存在dependencies中。 引入axios import axios from axios Vue.proto…

jQuery length 和 size()区别

jQuery length和size()区别总结如下&#xff1a; 1.length是属性&#xff0c;size()是方法。 2.如果你只是想获取元素的个数&#xff0c;两者效果一样既 $("img").length 和 $("img").size() 获取的值是一样的&#xff1b;但是如果是获取字符串的长…

一些关于自己的未来的东西

2019.7.4 自己大一建立对编程的基础认识&#xff0c;确实培养了一些兴趣&#xff0c;入了个门&#xff0c;不过没有接触到本质。大二加入到了学校的网站开发团队&#xff0c;对网站开发后端进行了学习&#xff0c;对后台开发也有了基础的学习吧&#xff0c;哈哈可能以后就是要走…

Javascript面向对象编程:构造函数的继承

今天要介绍的是&#xff0c;对象之间的"继承"的五种方法。 比如&#xff0c;现在有一个"动物"对象的构造函数。 function Animal(){ this.species "动物"; } 还有一个"猫"对象的构造函数。 function Cat(name,color){ this.name nam…

并发与多线程

并发 并发&#xff08;concurrency&#xff09;是指CPU在某个时间段内交替处理多任务的能力。每个CPU不可能只顾着执行某个进程&#xff0c;而让其他进程一直等待被执行。所以&#xff0c;CPU把可执行时间均分成若干份&#xff0c;每个进程执行一份或多份时间后&#xff0c;记录…

有没有朋友可以帮我解释一下贴水是什么意思?

通俗易懂的讲&#xff1a;贴水便宜&#xff0c;升水贵 当前&#xff0c;螺纹钢05合约就是贴水01合约 翻译&#xff0c;螺纹钢05合约就是比01合约便宜 升水同理 转载于:https://www.cnblogs.com/luoluo-123/p/11142229.html

es6常用点记录

letconst解构赋值字符串数组函数对象SymbolSetWeakSetMapWeakMapProxyreflectProxy与Reflex结合实例classpromiseiteratorGerneratorDecorators模块学习资料 let /* let 声明变量 *//* es6相对于es5的全局和局部作用域&#xff0c;多了一个块作用域&#xff0c;块作用域里声明的…

jquery插件封装指南

入门 编写一个jQuery插件开始于给jQuery.fn加入​​新的功能属性&#xff0c;此处添加的对象属性的名称就是你插件的名称&#xff1a; jQuery.fn.myPlugin function(){//你自己的插件代码};用户非常喜欢的$符号哪里去了&#xff1f; 它仍然存在&#xff0c;但是&#xff0c;为…

synchronize原理

synchronized的三种应用方式 一. 修饰实例方法&#xff0c;作用于当前实例加锁&#xff0c;进入同步代码前要获得当前实例的锁。 二. 修饰静态方法&#xff0c;作用于当前类对象加锁&#xff0c;进入同步代码前要获得当前类对象的锁。 三. 修饰代码块&#xff0c;指定加锁对象&…

不能修改“System Roots”钥匙串

iOS mac添加证书 不能修改“System Roots”钥匙串错误 如图&#xff1a; 解决方式&#xff1a; 打开钥匙串---登录---&#xff0c;直接把证书拖过来 然后&#xff0c;查看--我的证书&#xff0c;里面&#xff0c;找到证书&#xff0c;即可

stylus在vue中的使用

stylus是一个css预处理器&#xff0c;比较流行的css预处理器有sass、less、stylus&#xff0c;它们都一样&#xff0c;都是css的语法糖&#xff0c;可以使用变量&#xff0c;可以有简单的逻辑&#xff0c;使css的开发效率更高&#xff0c;更易维护。stylus来自node社区&#xf…

未来产品的设计

Donald A. Norman继《情感化设计》之后&#xff0c;又一设计精品力作&#xff1a; 未来产品的设计样章试读及本书预定&#xff1a;http://www.china-pub.com/195642市场价 &#xff1a;&#xffe5;39.00 会员价 &#xff1a; &#xffe5;29.25(75折) 【作  者】(美)Donald…

vue-cli webpack 配置分析

目录结构 . ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.c…

css之字体图标

SVG与字体图标 SVG图片是矢量图片&#xff0c;不会随着图片的伸缩而影响质量&#xff0c;通常把只有一种颜色的图标做成SVG&#xff0c;通过SVG生成字体图标&#xff0c;放到项目中使用。 https://icomoon.io/是一个比较快捷的生成字体图标的线上工具&#xff0c;进入主页后&…

history.back(-1)和history.go(-1)的区别

history.back(-1):直接返回当前页的上一页&#xff0c;数据全部消息&#xff0c;是个新页面 history.go(-1):也是返回当前页的上一页&#xff0c;不过表单里的数据全部还在 history.back(0) 刷新 history.back(1) 前进 history.back(-1) 后退

研发阶段模拟接口数据

因为在vue-cli工程中需要创建很多.vue文件&#xff0c;我们希望创建vue文件和创建html、css、js文件一样右键即可选择创建&#xff0c;并且创建的文件中可预先写好模板代码。 webstorm-Preferences打开选项界面 选择File and Code Templates&#xff0c;点击绿色加号 填…