【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,一经查实,立即删除!

相关文章

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…

并发与多线程

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

synchronize原理

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

不能修改“System Roots”钥匙串

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

未来产品的设计

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

css之字体图标

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

研发阶段模拟接口数据

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

真实项目中 ThreadLocal 的妙用

一、什么是 ThreadLocal ThreadLocal 提供了线程的局部变量&#xff0c;每个线程都可以通过 set() 和 get() 来对这个局部变量进行操作&#xff0c;但不会和其他线程的局部变量冲突&#xff0c;实现了线程间的据隔离。 简单讲&#xff1a;一个获取用户的请求线程 A&#xff0c;…

css之flex布局

flex布局是css3中的重要布局方式&#xff0c;称为“弹性布局”&#xff0c;每次想到它主要是遇到元素垂直居中、元素宽高自适应的问题&#xff0c;这些问题在flex中都能过简单设置就解决&#xff0c;它更像是原生APP中的布局操作&#xff0c;布局不必写N多的盒模型代码来实现&a…

javascript对URL中的参数进行简单加密处理

javascript的api本来就支持Base64&#xff0c;因此我们可以很方便的来进行编码和解码。 var encodeData window.btoa("namexiaoming&age10")//编码 var decodeData window.atob(encodeData)//解码。 下面来个具体的例子来说明如何对url中参数进行转码&#xff…

HTML元素title里面如何换行

在调试代码的时候我就遇到一个问题&#xff0c;HTML元素title里面通常只显示一行&#xff0c;那我想要他换行&#xff0c;就是多行显示&#xff0c;如何实现&#xff1f;JS代码里面比如Alert里面又该如何换行&#xff1f; 经过我的一番实验 要实现这种效果有几种方法&#xff0…

div内图片和文字水平垂直居中

大小不固定的图片、多行文字的水平垂直居中 本文综述 想必写css的都知道如何让单行文字在高度固定的容器内垂直居中&#xff0c;但是您知道或者想过让行数不固定的文字在高度固定的容器内垂直居中呢&#xff1f;本文将会告诉你如何实现多行文字的垂直居中显示。 关于图片垂直居…

敏友的【敏捷个人】有感(3): 有感于“敏捷个人”讨论与练习

2010年我对个人管理进行了自己的一些思考&#xff0c;在2011年提出敏捷个人概念&#xff0c;并且在线上、线下进行了多次交流&#xff0c;在一些大会上也做过分享。现在&#xff0c;已经有很 多IT和非IT的敏友们知道并在践行敏捷个人&#xff0c;帮助自己更快的成长。我收到大家…

jQuery编写插件

引言&#xff1a; 在项目中不同页面经常要用到已经写好的交互&#xff0c;比如弹窗&#xff0c;比如下拉菜单&#xff0c;比如选项卡&#xff0c;比如删除... 此时如果每次都把代码copy一份无疑是一件比较麻烦并且无趣的事情&#xff0c;而且个人认为有些low了&#xff0c;我们…

webstorm中nodejs代码提示

preferences->languages&frameworks->Node.js and Npm中选择一个本地的node版本 preferences->languages&frameworks->JavaScript->Libraries 勾选node.js Core 回到代码

Array.prototype.slice.call(arguments)

Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组&#xff0c;除了IE下的节点集合&#xff08;因为ie下的dom对象是以com对象的形式实现的&#xff0c;js对象与com对象不能进行转换&#xff09;如&#xff1a;1 var a{length:2,0:first,1:second}; 2 Ar…

nodejs常用模块-url

URL nodejs中针对url的常用方法。 node下打印url&#xff0c;结果&#xff1a; 引入url模块 var url require(url) 1、parse方法 将url解析成对象&#xff0c;parse方法原型&#xff1a; url.parse(urlStr[, parseQueryString][, slashesDenoteHost]) 可传递三个参数…

常用的javascript设计模式

请坚持 什么是设计模式 百度百科&#xff1a; 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问&#xff0c;设计模式…

iOS警告-This block declaration is not a prototype

关于警告 我们定义一个不带参数的block,通常是如下的方式 1typedefvoid (^UpdateSwichBtnBlock)();在xcode9中会提示一个警告 12This block declaration is not a prototypeInsert ‘void解决方式可以是如下的几种 1typedefvoid (^UpdateSwichBtnBlock)(void);但是这样,很多第三…