Unity3D 游戏开发构架篇 ——输入控制
来源:互联网 发布:广东省网络干部培训 编辑:程序博客网 时间:2024/05/21 21:07
临近毕业之初,进入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 framevoid 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的博客发布越来越慢,还需要验证码,烦死了,后期转到博客园去了。
0 0
- Unity3D 游戏开发构架篇 ——输入控制
- Unity3D 游戏开发构架篇 —— UI堆栈
- Unity3D 游戏开发构架篇 ——角色类的设计与持久化
- Unity3D——个人游戏Car的游戏中控制
- Unity3D自学笔记——脚本开发的输入与控制
- Unity3D游戏开发之角色控制效果
- [Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果
- [Unity3D]Unity3D游戏开发之角色控制漫谈
- Unity3D游戏开发之从Unity3D项目版本控制说起
- [Unity3D]Unity3D游戏开发之角色控制漫谈
- 游戏开发之输入控制类:InputManager_
- 游戏开发学习笔记-6.输入控制
- unity3d输入与控制——键盘事件
- unity3d学习笔记1——输入控制Input
- unity3d输入与控制——键盘事件
- Mysql构架——并发控制
- [Unity3D]Unity3D游戏开发之从《魂斗罗》游戏说起(上)——目标追踪
- Unity3D游戏开发之仿仙剑奇侠传角色控制效果
- Android service服务、aidl接口demo
- IOS protocol 的使用
- 简单枚举
- Onvif用户验证之gSOAP插件wsseapi调用实现
- Ubuntu下配置samba服务器
- Unity3D 游戏开发构架篇 ——输入控制
- 程序设计、数据结构、编译相关图灵奖得主简介之一
- rsync+inotify实现服务器之间文件实时同步
- poj 2438 图遍历之哈密顿回路
- C++ 图的实现
- 免费空间的选择
- MFC连接ACCESS数据库
- 神华集团世界500强酷站欣赏
- 程序设计、数据结构、编译相关图灵奖得主简介之二