PacMan 01——玩家移动
版权申明:
- 本文原创首发于以下网站:
- 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
- 优梦创客的官方博客:https://91make.top
- 优梦创客的游戏讲堂:https://91make.ke.qq.com
- 『优梦创客』的微信公众号:umaketop
- 您可以自由转载,但必须加入完整的版权声明
player的行走
行走原理:
1.每次移动一个单位,判断是否有障碍物,障碍物不可以穿越
2.在按下按键时候触发一个方法,该方法生成一个射线,如果发现墙壁,则就返回true
3.只有四个移动方向
4.每次移动距离都要与豆子间隔相等
代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
float Speed=5f;//移动速度
Vector2 playerto;//移动方向
void Start()
{
playerto = gameObject.transform.position;//初始位置
}
void FixedUpdate()
{
//移动方法
Vector2 a = Vector2.MoveTowards(this.gameObject.transform.position, playerto, Speed * Time.fixedDeltaTime);//移动方法
this.gameObject.GetComponent<Rigidbody2D>().MovePosition(a);//利用rigidoby2D移动
if ((Vector2)gameObject.transform.position == playerto)
{
Vector2 s=Vector2.zero;
if (Input.GetKey(KeyCode.A)&&!CanGo(Vector2.left))
{
s = Vector2.left;
}
else if (Input.GetKey(KeyCode.S)&&!CanGo(Vector2.down))
{
s = Vector2.down;
}
else if (Input.GetKey(KeyCode.D)&&!CanGo(Vector2.right))
{
s = Vector2.right;
}
else if (Input.GetKey(KeyCode.W)&&!CanGo(Vector2.up))
{
s = Vector2.up;
}
playerto += s;//改变移动坐标
gameObject.GetComponent<Animator>().SetFloat("DirX",s.x);//播放相应的动画
gameObject.GetComponent<Animator>().SetFloat("DirY",s.y);
}
}
void Update()
{
}
bool CanGo(Vector2 ss)//检测方法
{
//Debug.Log("检测到障碍物");
RaycastHit2D raycastHit2=Physics2D.Linecast(this.transform.position,(Vector2)this.transform.position+ss,1<<LayerMask.NameToLayer("map"));
if (raycastHit2==true)
{
Debug.Log("检测到障碍物");
}
return raycastHit2;//返回射线信息
}
}
状态机
FSM
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StaticMachine<T> : MonoBehaviour {
// 状态机控制器;
public SureStatic<T> SureStatic = null;//当前的状态;
public T owner;//状态机拥有者;
public void Init(T owner,SureStatic<T> initalState)
{
this.owner = owner;
SureStatic = initalState;
ChangeState(SureStatic);//状态机变化方法
}
public void ChangeState(SureStatic<T> NewState)
{
if (NewState!=null)
{
SureStatic.Exit(owner);
}
SureStatic = NewState;
SureStatic.Enter(owner);
}
public void Update()
{
SureStatic.Update(owner);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SureStatic<T> : MonoBehaviour
{
//被用于继承
public virtual void Exit(T a)//状态退出
{
}
public virtual void Enter(T b)//状态进入
{
}
public virtual void Update(T c)//状态更新
{
}
}
怪物的状态转换(只有出发和巡逻)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Moster : MonoBehaviour {
StaticMachine<Moster> machine = new StaticMachine<Moster>();
public List<Vector2> LiveHomePath;
public float speed = 4f;
class WayPointSetect:SureStatic<Moster>//一种状态,出发状态
{
private List<Vector2> path;
private int index;//当前走的路径点个数
public WayPointSetect(List<Vector2> path)
{
this.path = path;
this.index = 0;
}
public override void Update(Moster c)
{
Vector2 a = Vector2.MoveTowards(c.transform.position,path[index],c.speed*Time.fixedDeltaTime);
c.GetComponent<Rigidbody2D>().MovePosition(a);
if ((Vector2)c.transform.position==a)
{
index++;
if (index>=path.Count)//.count属性判断元素真实个数
{
c.machine.Init(c,new XunluoPoint());//走完路点后,开始巡逻状态
Debug.Log("出发路点完成");
}else
{
Vector2 b = path[index] - path[index - 1];
c.GetComponent<Animator>().SetFloat("MirX",b.x);
c.GetComponent<Animator>().SetFloat("MirY",b.y);
}
}
}
}
class XunluoPoint:SureStatic<Moster>//巡逻状态
{
private Vector2 dir;//目标点
private Vector2 Edir;//当前方向向量
private Vector2[] EdirTo = new Vector2[] { Vector2.left, Vector2.up,Vector2.right,Vector2.down };
public override void Enter(Moster b)
{
dir = b.transform.position;
Edir = b.transform.position;
}
public override void Update(Moster c)
{
//Edir = c.transform.position;
Vector2 b = Vector2.MoveTowards(c.transform.position,dir,c.speed*Time.fixedDeltaTime);
c.gameObject.GetComponent<Rigidbody2D>().MovePosition(b);
if ((Vector2)c.transform.position==dir)
{
List<Vector2> Averation = new List<Vector2>();
for (int i=0;i<EdirTo.Length;i++)
{
if (EdirTo[i]==-Edir)
{
Debug.Log("相反,跳出路径;");
continue;
}
if (c.CanGo(EdirTo[i]) == false)
{
Averation.Add(EdirTo[i]);
}
}
int a = Random.Range(0,Averation.Count);
Edir = Averation[a];
dir += Averation[a];
//Vector2 s = dir - Edir;
c.GetComponent<Animator>().SetFloat("MirX", Edir.x);
c.GetComponent<Animator>().SetFloat("MirY", Edir.y);
}
}
}
private bool CanGo(Vector2 dir)
{
RaycastHit2D a = Physics2D.Linecast(this.transform.position,(Vector2)this.transform.position+dir,1<<LayerMask.NameToLayer("map"));
return a;
}
void Start ()
{
machine.Init(this, new WayPointSetect(LiveHomePath));//初始化
}
void FixedUpdate()
{
machine.Update();//每帧调用
}
}
PacMan 01——玩家移动的更多相关文章
- PacMan 01——地图的搭建
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- 【强化学习】python 实现 q-learning 例五(GUI)
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10143579.html 感谢pengdali,本文的 class Maze 参考了他的博客, ...
- Linux 桌面玩家指南:01. 玩转 Linux 系统的方法论
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- PacMan 03——追踪玩家
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity中制作游戏的快照游戏支持玩家拍快照
Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...
- Pacman主题下给Hexo增加简历类型
原文 http://blog.zanlabs.com/2015/01/02/add-resume-type-to-hexo-under-pacman-theme/ 背景 虽然暂时不找工作,但是想着简历 ...
- nyoj 203 三国志(最短路加01背包)
三国志 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下, ...
- 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇01:道路的自动生成》
1.道路的自动生成 道路自动生成概述: 3D跑酷游戏的核心就是跑,在跑这一过程中增加趣味性使得游戏具有更多的可玩性.道路的自动生成和自由拼接,为游戏增设了更多的不可预见性.这种不可预见性使得玩家在游戏 ...
- Unity多玩家网络游戏开发教程1章Unity带有网络功能
Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件.专门提供了对网络功能的支持. 可是.大部分开发人员第一次接触到的还是Unity自带的网络功能.也就是大家常 ...
随机推荐
- C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)
一.为什么使用泛型? 泛型其实就是一个不确定的类型,可以用在类和方法上,泛型在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用者调用时,传入指定的类型,才会用确切的类型将占位符替换 ...
- 集合系列 List(二):ArrayList
ArrayList 是 List 集合的列表经典实现,其底层采用定长数组实现,可以根据集合大小进行自动扩容. public class ArrayList<E> extends Abstr ...
- MySQL之主从同步
一.主从同步概念 1.1 什么是主从同步? MySQL 主从同步是指将数据从一个 MySQL 数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器 ...
- Java 并发编程(一):摩拳擦掌
这篇文章的标题原本叫做——Java 并发编程(一):简介,作者名叫小二.但我在接到投稿时觉得这标题不够新颖,不够吸引读者的眼球,就在发文的时候强行修改了标题(也不咋滴). 小二是一名 Java 程序员 ...
- Python 基础1 - 位运算符
引言 本文主要介绍位运算符,实际上Python有以下7类运算符: [赋值运算符].[比较运算符].[算术运算符].[逻辑运算符].[身份运算符].[成员运算符].[位运算符] 位运算符 按位运算符是把 ...
- 用故事解析setTimeout和setInterval(内含js单线程和任务队列)
区别: setTimeout(fn,t): 延迟调用,超过了时间就调用回调函数,返回一个id,使用clearTimeout(id)取消执行. 注意:取消了里面的回调函数就不执行了哦,而不是取消的时候就 ...
- node.js的特点与模块化开发
node.js的代码都是构建在模块化开发的基础之上,模块化开始也是node.js的核心之一. node.js跳过了服务器,它自己不用建设在任何服务器软件之上,node.js的许多设计理念与经典架构(L ...
- Ada and Coins
Ada and Coins 题意:钱包里有n种钱,然后有m次询问,询问[l,r]区间内能被表示的个数有几个. 题解:这道题是群主推荐我写的,然后让我用bitset去写,他说 操作32个bitset需要 ...
- codeforces 459 D. Pashmak and Parmida's problem(思维+线段树)
题目链接:http://codeforces.com/contest/459/problem/D 题意:给出数组a,定义f(l,r,x)为a[]的下标l到r之间,等于x的元素数.i和j符合f(1,i, ...
- 洛谷 P4206 [NOI2005]聪聪与可可 题解
题面 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每 ...