U3D贪吃蛇心得以及个人遇到的问题警戒以及勉励今后的自己
首先附上头部代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class trans : MonoBehaviour {
//
public GameObject foodPrefab;
public GameObject bodyPrefab;
public float speed=2;
private bool _isOver=false;
//计时器
private float _Time = 0f;
//链表头部第一个身体部分
private body FirstBody;
//链表尾部最后一个身体部分
private body LastBody;
private Vector3 now_pos;
private enum direction {
forward,
back,
left,
right,
};
private direction _now = direction.forward;
private direction _turn=direction.forward;
// Use this for initialization
void Start() {
createFood();
}
void createFood() {
float x = Random.Range(-9.5f, 9.5f);
float z = Random.Range(-9.5f, 9.5f); //旋转自身的角度(不旋转)
GameObject food = Instantiate(foodPrefab,new Vector3(x,0f,z),Quaternion.identity) as GameObject;
}
void OnTriggerEnter(Collider other) { //这个other就是被碰撞体
if (other.tag.Equals("bound")|| other.tag.Equals("body")) {
_isOver = true;
}
else if (other.tag.Equals("food")) {
Destroy(other.gameObject);
createBody();
createFood();
}
}
// Update is called once per frame
void Update() {
if (!_isOver){
check_key_toMove(speed);
}
}
void createBody(){
GameObject _body = Instantiate(bodyPrefab,new Vector3(9999f,9999f,9999f),Quaternion.identity) as GameObject;
if (_body == null) {
}
//obj与body类绑定获取方法(刚开始是猜测)
//我在疑惑既然是绑定也就是说脚本body和GameObject类型的_body绑定了,却显示空指针异常
//为何还要把body脚本绑定在身子GameObject的模型上成为预制体才能正常,这不是多此一举吗
//事后我又把body脚本绑定在head的(GameObject)模型上,依然显示空指针异常
//根据事实结果我的猜测是错误的,根据字义理解是获取成分
//我再次推测GetComponent并没有绑定,只是单纯的获取bodyprefab的成分
//于是为了验证,我去查了官方文档
//Returns the component of Type type if the game object has one attached, null if it doesn't.
//果不其然获取依附在GameObject(bodyPrefab)的成分,如果没有就返回空。果然空指针就是这么引起的
//由此看来后来的假设是正确的,其实现在想想以前的想法确实挺傻,给body脚本一个模型成预制体->创建Gameobject->选取Gameobject的成份就是为了调用脚本,就行了
body obj =_body.GetComponent<body>();
if (FirstBody == null) {
//C#这里是吧obj的地址赋予给了FirstBody,而不是克隆
FirstBody = obj;
}
if (LastBody != null) {
LastBody.next = obj;
}
LastBody = obj;
}
void check_key_toMove(float Speed){
if (Input.GetKey(KeyCode.W)) {
//如果当前方向为下根据游戏规则他是不能按上的,否则响应按键
if (_now != direction.back)
{
_turn = direction.forward;
}
else {
//如果当前方向为为下,他会忽视按键,继续当前方向运行。
_turn = _now;
}
}
else if (Input.GetKey(KeyCode.S)){
if (_now != direction.forward)
{
_turn = direction.back;
}
else
{
_turn = _now;
}
}
else if (Input.GetKey(KeyCode.A))
{
if (_now != direction.right)
{
_turn = direction.left;
}
else
{
_turn = _now;
}
}
else if (Input.GetKey(KeyCode.D))
{ //相当于自身的蓝线(Z轴)改变了正方向,他是旋转性的改变。
if (_now != direction.left)
{
_turn = direction.right;
}
else
{
_turn = _now;
}
}
_Time += Time.deltaTime;
if (_Time >= 1f / Speed) {
switch (_turn) {
case direction.left: transform.forward = Vector3.left; break;
case direction.right: transform.forward = Vector3.right; break;
case direction.forward: transform.forward = Vector3.forward; break;
case direction.back: transform.forward = Vector3.back; break;
}
move();
_Time = 0f;
}
}
void move(){
now_pos = transform.position;
//这里沿着自身蓝线(Z轴)前进,但是世界坐标并没有改变
//Vector3.forward虽说是(0,0,1)但是这里是相对于自身蓝线进行的(0,0,1),见Translate的解释
//如果相对于世界的话需要引入第二个参数Space.World,见transform.forward与Vector.forward的区别
transform.Translate(Vector3.forward);
_now = _turn;
if (FirstBody != null) {
FirstBody._move(now_pos);
}
}
}
再次附上body代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class body : MonoBehaviour {
//下一个body的引用,其实就是链表
public body next;
public int say() {
return 5;
}
public void _move(Vector3 pos) {
Vector3 nextPos = transform.position;
transform.position = pos;
if (next != null)
{
next._move(nextPos);
}
}
}
Time.deltaTime代表的是一秒为单位每帧消耗的时间, 在Update中 就是按帧来运行的 一秒运行60次60帧。 当一个数据乘以Time.deltaTime时代表一秒钟走该数据,而不是每帧走该数据。在update中Time.deltaTime 大约平均在在1/60=0.016秒。
总结:自己突发想法写一个游戏,来验收自己最近学习的成果,因为初学,于是选择了较为简单的贪吃蛇,代码根据思路,贪吃蛇就是单纯的用到了链表,总其步骤有5步:第一步创建蛇头让蛇头自由运动加入刚体创建碰撞触发器(墙的边缘),第二部创建食物(完善碰撞触发器),第三部创建身体(完善脚本,算法用到的就是链表,进行构造链表方法,完成body预制体) 第四部蛇头引入body预制体完成链表并开始移动 第五步测试最终BUG,除了第二步第三步 第一步第四部第五步都遇到到了难点疑点,在注释中大多都标注了,我相信天道酬勤,写此文章,警示以及勉励今后我unity3D的学习。
U3D贪吃蛇心得以及个人遇到的问题警戒以及勉励今后的自己相关推荐
- c语言贪吃蛇实践总结与体会,贪吃蛇心得体会
1.建立三个外接文件,分别是写出游戏引擎.描述食物的.描述蛇的js. 2.在主页面进行游戏的运行. 3.在游戏引擎的页面里面,分别定义行数和列数,然后定义一个空的数组A.开始有戏的引擎的函数里面包含了 ...
- 贪吃蛇小游戏编写心得
https://github.com/Devilzero/6 http://www.cnblogs.com/liangjianming/p/4510346.html package 贪吃蛇; impo ...
- 手机java做贪吃蛇_如何用Java写一个贪吃蛇游戏
这是一位拓胜学员用Java写贪吃蛇游戏的心得:今天课程设计终于结束了自己学java没以前学C+那么用功了觉得我学习在哪里都是个开口向上的抛物线,现在应该在右半边吧,好了进入正题. 写java贪吃蛇也是 ...
- 你真以为贪吃蛇是个简单的游戏?
博客搬家:最爱午后红茶 诺基亚手机经典游戏,规则不多说~ 先上一个多年前火了一段时间的 gif 动态图以表达敬意: 听说这是一个俄罗斯人用程序实现的. 所以这里想谈一下 贪吃蛇如何才能把地图填满? 我 ...
- #进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏
#进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏. 想必很多大一新生在刚学C语言时和我们遇到过同样的问题,就是如何去做第一个C语言大作业. 我们小组内部在讨论大作业时,并不打算 ...
- 【C语言】贪吃蛇游戏的实现(一)
(注意:本代码是在VC++6.0环境下编译的,在其他环境如codeblocks下运行可能会产生意想不到的问题,请尽量使用VC.至于为什么要使用VC编译,哦,我亲爱的朋友,这只有上帝才知道) 最近由于小 ...
- 用python自带的tkinter做游戏(一)—— 贪吃蛇 篇
用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 本人新手,刚自学python满半年,现分享下心得,希望各位老手能指点一二,也希望和我一样的新手能共勉,谢谢~ 大家都知道用python做 ...
- java小游戏贪吃蛇
开发工具 :eclips 运行主要代码截图 实现的功能: (1)播放bgm并且可以通过空格暂停 (2)空格实现游戏暂停,再次空格可以继续游戏 (3)头碰到尾巴会结束游戏 (4)右上角可以记录贪吃蛇的长 ...
- c语言贪吃蛇大作业报告,C语言贪吃蛇实验报告
C语言贪吃蛇实验报告 C 语言程序设计实训报告姓 名 专 业 班 级 指导教师 二 011 年 7 月 14 日I I目录1 实训目的和要求 11.1 实训目的和任务 11.2 实训要求 12 实训任 ...
最新文章
- 10分钟学会php面相对象基础(Ⅰ)
- [云炬创业基础笔记]第一章创业环境测试8
- 复制多级文件夹【应用】
- 详细关闭iiop方法_疏通暖气片堵塞的方法,看完你就知道了!
- http 直接显示目录下文件_Linux文件管理(下)
- UR5 IK group中遇到的问题
- 如何下载项目所需要jar包
- 【jvm】jdk编译-未成功
- XXXXRockey4ND加密狗复制
- IDS和IPS是什么,有什么区别?
- python列表和字典的区别_Python中列表和字典有什么区别,分别适用于什么场景?...
- Excel电子表格操作
- SaaS启动阶段增长指南(上)
- 常见杀软对应的进程名
- 帝国CMS7.2重置后台密码
- ps教程:教你如何制作一种牛仔布料
- 微博红包技术探究:架构、防刷、监控和资源调度
- wps思维导图聚焦模式是灰色不能用的解决方案
- 算法复杂度:算法时间复杂度和空间复杂度表示法
- js实现touch移动触屏滑动事件
热门文章
- 最经典的flash鼠标绘画技术详解(六)
- 揭秘郭盛华在世界的排名,才华与颜值并存的男神
- 代码块(静态代码块和非静态代码块)(重难点)
- Safari访问本地html,safari本地文件读取漏洞之扩展攻击面 | CN-SEC 中文网
- 华为OD机试题 - 基站维修工程师(JavaScript)| 机考必刷
- 桶排序 (详细图解)
- 日常DDoS防御的一些小知识
- SpringBoot实现WebSocket
- opencv3.1 提取图像中某一像素点的HSV值并判断颜色
- 【Leedcode】环形链表必备的面试题和证明题(附图解)