Unity 之 Redux 模式(第二篇)—— Rigidbody 改造,摄像机控制
作者:软件猫
日期:2016年12月8日
转载请注明出处:http://www.cnblogs.com/softcat/p/6144041.html
上一篇文章中存在一个很严重的问题,首先我们先让 Main Camera 跟随 Player 移动
Main Camera 跟随 与 阻挡物
用 Redux 模式,我们可以很轻易的实现这个功能。
1、创建 MainCameraViewProvider.cs
using UnityEngine; public class MainCameraViewProvider : ViewProvider
{
protected override void OnFixedStateChanged (State state)
{
// 使用 Player 的 x,y 坐标,并保持 z 坐标
transform.position = new Vector3 (state.Player.Position.x, state.Player.Position.y, transform.position.z);
}
}
2、将 MainCameraViewProvider.cs 拖放至 Main Camera。
3、使用下面的图片创建一个新的精灵,并拖入场景,命名为 Rock。

4、给 Rock 添加 Box Collider 2D
执行游戏后,我们发现当 Player 被 Rock 挡住的时候,MainCamera 仍然在向前移动。这是因为 Rigidbody 发现 Player 被 Rock 阻挡了,阻止了 Player 的移动,但是 AxisReducer 仍然在改变 PlayerState 中的 Position。
下面要针对这个问题进行改造。
改造 Rigidbody2D
改造思路是这样的:InitAction 时,传入 Player 的 Rigidbody2D 组件,用 Rigidbody2D 来决定 Position 和 Rotation。
下面的代码中,加粗部分是新增以及修改后的代码,划线部分是删除的代码。
1、改造 PlayerState.cs
using UnityEngine; namespace Player
{
public class PlayerState
{
// 用于控制位置的刚体
public Rigidbody2D Rigidbody { get; set; } // 玩家坐标
public Vector2 Position {
get { return Rigidbody.position; }
set { Rigidbody.MovePosition (value); }
} // 玩家面向的方向
public float Rotation {
get { return Rigidbody.rotation; }
set { Rigidbody.MoveRotation (value); }
} // 移动速度
public float Speed { get; set; } }
}
2、改造 PlayerActions.cs
using UnityEngine; namespace Player
{
// Player 初始化,设置坐标、旋转角度与移动速度
public class InitAction : IAction
{
public Vector2 position { get; set; }
public float rotation { get; set; }
public float speed { get; set; } public Rigidbody2D rigidbody { get; set; }
} // 移动轴
public class AxisAction : IAction
{
public float x { get; set; } public float y { get; set; }
}
}
3、改造 PlayerViewProvider.cs
using UnityEngine; namespace Player
{
public class PlayerViewProvider: ViewProvider
{
[SerializeField]
float speed = 3f; Rigidbody2D rigid = null; void Start ()
{
rigid = GetComponent<Rigidbody2D> (); // 执行初始化
Store.Dispatch (new InitAction () {
position = transform.position,
rotation = transform.rotation.eulerAngles.z,
speed = this.speed,
rigidbody = GetComponent<Rigidbody2D> (),
});
} void FixedUpdate ()
{
// 获取轴数据,并传递 Action
float ax = Input.GetAxis ("Horizontal");
float ay = Input.GetAxis ("Vertical"); if (ax != || ay != ) {
Store.Dispatch (new AxisAction () { x = ax, y = ay });
}
} protected override void OnFixedStateChanged (State state)
{
if (rigid != null) {
// 刚体旋转和移动
rigid.MoveRotation (state.Player.Rotation);
rigid.MovePosition (state.Player.Position);
}
} }
}
执行游戏,刚体问题解决了。
这里有一点违反 Redux 模式,但是并不会影响整个架构。就这样。
Unity 之 Redux 模式(第二篇)—— Rigidbody 改造,摄像机控制的更多相关文章
- Unity 之 Redux 模式(第一篇)—— 人物移动
作者:软件猫 日期:2016年12月6日 转载请注明出处:http://www.cnblogs.com/softcat/p/6135195.html 在朋友的怂恿下,终于开始学 Unity 了,于是有 ...
- 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发
第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...
- Spring Cloud第二篇 | 使用并认识Eureka注册中心
本文是Spring Cloud专栏的第二篇文章,了解前一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 一.Sprin ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- 深入理解javascript对象系列第二篇——属性操作
× 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...
- [转]Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...
- 【OpenGL】第二篇 Hello OpenGL
---------------------------------------------------------------------------------------------------- ...
- 深入理解javascript函数系列第二篇——函数参数
× 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...
- IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)
IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...
随机推荐
- C#中删除字符串最后一个字符的几种方法
转载地址 偶然看到的,记录一下,以免忘记 字符串:string s = "1,2,3,4,5," 目标:删除最后一个 "," 方法: 1.用的最多的是Su ...
- 百度地图JavaScript API V1.5初级开发工具类
/** * 百度地图使用工具类-v1.5 * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email boo ...
- 【错误】:Could not open JDBC Connection for transaction; nested exception is: Communications link failure;The last packet sent successfully to the server was 1 milliseconds ago
# #错误日志 2016-11-10 16:19:20,834 ERROR [org.quartz.core.JobRunShell] - Job DEFAULT.jobtask threw an u ...
- Redis 3.0集群 Window搭建方案
Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...
- python中的那些“神器”
"武林至尊,宝刀屠龙,号令天下,莫敢不从,倚天不出,谁与争锋",这是神器.不过今天要说的python中的"神器"就没有这么厉害了,这里要说的"神器&q ...
- IOS 加载中提示框
LoadingView.h #import <Foundation/Foundation.h> @class MBProgressHUD; @interface LoadingView : ...
- Android学习总结——Content Provider
原文地址:http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html Content Provider内容提供者 : and ...
- lua select
可以用这样的方法产生类似foreach的功能: function printargs(...) local num_args = select("#", ...) for i = ...
- iOS开发系列--打造自己的“美图秀秀”
概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Co ...
- 深入浅出NodeJS——异步I/O
底层操作系统,异步通过信号量.消息等方式有着广泛的应用. PHP语言从头到尾都是以同步堵塞方式执行,利于程序猿顺序编写业务逻辑. 异步I/O.事件驱动.单线程构成Node的基调. why异步I/O ( ...