Unity3D 游戏开发构架篇 ——输入控制
临近毕业之初。进入Unity3D这个行业,是一家小工作室。老板人非常不错,公司氛围也非常单纯。近期公司开发一款小游戏,初次上手,颇多周折,记录下自己的开发心得。主要涉及一些设计理念,互相交流。
先说下项目背景。主要是一款闯关游戏,山寨了敲冰块与雷霆战机。
一、人物控制
- // This script moves the character controller forward
- // and sideways based on the arrow keys.
- //这个脚本用箭头键向前移动和側移角色控制器。
- // It also jumps when pressing space.
- //当按下空格键时。它跳起。
- // Make sure to attach a character controller to the same game object.
- //确保把一个character controller组件附加到同一个游戏物体上。
- //It is recommended that you make only one call to Move or SimpleMove per frame.
- //建议你每帧仅仅调用一次Move或者SimpleMove。
- var speed : float = 6.0;
- var jumpSpeed : float = 8.0;
- var gravity : float = 20.0;
- private var moveDirection : Vector3 = Vector3.zero;
- function Update() {
- var controller : CharacterController = GetComponent(CharacterController);
- if (controller.isGrounded) {
- // We are grounded, so recalculate
- // move direction directly from axes
- //我们着地了,所以直接通过轴又一次计算move direction。
- moveDirection = Vector3(Input.GetAxis("Horizontal"), 0,Input.GetAxis("Vertical"));
- moveDirection = transform.TransformDirection(moveDirection);
- moveDirection *= speed;
- if (Input.GetButton ("Jump")) {
- moveDirection.y = jumpSpeed;
- }
- }
- // Apply gravity
- //应用重力。
- moveDirection.y -= gravity * Time.deltaTime;
- // Move the controller
- //移动控制器。
- controller.Move(moveDirection * Time.deltaTime);
- }
上面的一段代码是圣典中的一段角色控制代码。也是我项目最原始的人物控制代码版本号。
可是考虑到输入设备的不同。我们就要考虑到代码的重用性,比方Android移动平台和PC平台等等。
二、设计思想
能够把输入设备做一个输入模块,发出信号,其内部的逻辑实现都运动控制模块实现。这样就分离了开来。耦合性减少。
大致思想例如以下图所看到的
三、代码实现
这个设计严格说起来可能还有点复杂,可是我本身非常赞赏这个做法——逻辑和表现的分离。
以下附上核心代码
类图例如以下
PCInput.CS
- public class PCInput : MonoBehaviour {
- private PlayControl mycontrol;
- void Awake()
- {
- mycontrol = GetComponent<PlayControl>();
- DebugUtils.Assert(mycontrol != null );
- }
- // Update is called once per frame
- void Update () {
- mycontrol.ChangePosition(Input.GetAxis("Horizontal"));
- if (Input.GetButton("Jump"))
- {
- //call jump
- mycontrol.Set_Jump();
- }
- }
- }
PlayControl.CS
- public void ChangePosition(float x)
- {
- if (isGrounded()) {
- //print("isgrond");
- moveDirection = new Vector3(x, 0.0f, 0.0f);
- if (Startjump) {
- moveDirection.y = jumpSpeed;
- }
- //仅仅有在地面才干控制速度
- moveDirection *= speed;
- }
- moveDirection.y -= gravity * Time.deltaTime;
- controller.Move(moveDirection * Time.deltaTime);
- }
- public bool Startjump = false;
- void Recover()
- {
- Startjump = false;
- }
- public void Set_Jump() {
- Startjump = true;
- Invoke ("Recover", 0.1f);
- }
Android就不发了。 本身都是一个思路。
四、延伸
事实上这个模块也能够用来控制动画。比方行走和精巧的动画能够由虚拟轴控制等等。
欢迎大家对博客的留言讨论。CSDN的博客公布越来越慢,还须要验证码,烦死了,后期转到博客园去了。
Unity3D 游戏开发构架篇 ——输入控制的更多相关文章
- Unity3D 游戏开发构架篇 ——角色类的设计与持久化
在游戏开发中,游戏角色占了很大的篇幅,可以说游戏中所有的内容都是由主角所带动.这里就介绍一下角色类的设计和持久化. 一.角色类应用场景和设计思想 游戏中的角色类型不一而足,有不同的技能,有不同的属性等 ...
- Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理
项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...
- Unity3D 游戏开发架构篇 ——性格一流的设计和持久性
在游戏开发.游戏人物占了非常大的空间.所有内容都是由主角可以说游戏驱动. 下面来介绍一下一流的设计和持久性的作用. 一.应用场景 游戏中的角色类型不一而足,有不同的技能.有不同的属性等等.有些一个玩家 ...
- 用户输入- Unity3D游戏开发培训
用户输入- Unity3D游戏开发培训 作者:Jesai 时间:2018-02-12 14:28:45 用户输入Input 鼠标按键: -方法:GetMouseButton(); -方法:GetM ...
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
- [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪
朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...
- [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果
大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...
随机推荐
- (诊断)为GitHub添加SSH key时出现“Could not open a connection to your authentication agent”错误的应对方案(转)
在为windows 环境下的github账户添加SSH key时,需要在Git Bash执行如下命令: 第一步:检查已有的SSH keys $ ls -al ~/.ssh 第二步:生成新的SSH ke ...
- android APP 中微信分享功能实现 的总结
//花了很长时间最终完成了微信分享功能,中间走了很多弯路,在此做一下小结,希望对在应用中使用到微信分享的朋友有所帮助. 主要问题就是下面两个: 1.为什么运行了项目之后,微信分享只是闪了一下就没有了? ...
- 将DataTable 存到一个集合当中
将DataTable 存到一个集合中 此做法来自:http://www.codeproject.com/Articles/692832/Simple-way-of-using-SQL-DataTabl ...
- BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整( dp )
最优的做法最后路面的高度一定是原来某一路面的高度. dp(x, t) = min{ dp(x - 1, k) } + | H[x] - h(t) | ( 1 <= k <= t ) 表示前 ...
- Linux权限操作 [转]
Linux权限操作 本文内容来自<鸟哥linux私房菜>读后个人做的笔记,该书实为学习linux的很好入门教材 一.文件属性 ls ls -al列出所有的档案属性 ls是List的意思 档 ...
- C中嵌入SQL
连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息. #include <stdio.h> #include <stdlib.h> #inc ...
- 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件
查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器上:加载符号自动或在要求. 内容 查找符号 (.pdb) 文件 查找源文件 查找符号 (.pdb) 文件 说明 在之前的 Vis ...
- 七牛用户如何将视频转码成普清高清来适应不同的手机端或者web端
Qiniu 七牛问题解答 非常多人会用到七牛视频转码问题,要将视频转码成适用于各种终端的视频,也有的用户对转码服务的码率,帧率,分辨率等理解不多.不知道该怎样设置这些參数.以下我给大家科普一下. 问题 ...
- 基于visual Studio2013解决面试题之0510连续数之和
题目
- linux-shell脚本命令之sed
[ sed简单介绍: ] sed是一个非常好的文件处理工具, 它本身是一个管道命令, 以行为单位进行处理, 能够用于对数据行进行新增.选取.替换.删除等操作. sed命令行格式:sed [-nefri ...