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 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...
随机推荐
- codecomb 2085【肥得更高】
题目背景 自2009年以来,A.B站的历史就已经步入了农业变革的黎明期. 在两站的娱乐及音乐区,金坷垃制造业早已得到长足的发展,甚至有些地方还出现了坷垃翻唱的萌芽. 新兴肥料人开始走上历史的舞台. 他 ...
- bzoj2100 [Usaco2010 Dec]Apple Delivery
Description Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course, ...
- RBF径向基神经网络——乳腺癌医学诊断建模
案例描述 近年来疾病早期诊断越来越受到医学专家的重视,从而产生了各种疾病诊断的新方法.乳癌最早的表现是患乳出现单发的.无痛性并呈进行性生长的小肿块.肿块位于外上象限最多见,其次是乳头.乳晕区和内上象限 ...
- LeeCode(Database)-Employees Earning More Than Their Managers
The Employee table holds all employees including their managers. Every employee has an Id, and there ...
- 【转】Android LCD(一):LCD基本原理篇
关键词:android LCD TFT 液晶 偏光片 彩色滤光片 背光 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exyno ...
- Js 中常用方法
一.获取唯一值(2014-12-23) function newGuid() { var guid = ""; var n = (((1 + Math.random()) * 0x ...
- andorid 控件 Bootstrap3.0风格的控件 精美UI控件库
Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架.Bootstra ...
- python 笔记3--高级特性
切片 语法 L[l:r] 取L[l],L[l+1]-L[r-2],L[r-1] L[l:r:m] 取L[l],L[l+m],L[l+2*m],L[l+3*m]-.(满足l+n*m<=r-1) t ...
- 学习asp.net Identity 心得体会(连接oracle)
asp.net Identity具体功能暂不在此细说,下面主要介绍几点连接oracle注意的事项, 1.首先下载连接oracle驱动Oracle.ManagedDataAccess.dll和Oracl ...
- PHP学习笔记十三【二维数组】
<?php //二维数组 $arr=array(array(1,2,3),array(4,5,6)); $arr1[0]=array(12,34,65); $arr1[1]=array(34,6 ...