先把FollowCamera禁用
先把FollowCamera禁用
#include int main(){ return 0; }
Emmison自发光
如果有角落交界处灯光烘培有问题的话,就去调节lighting面板里头的indirect Resolution的强度
compress lightmaps压缩光照贴图(模糊)
如果烘培后没有产生相应的场景的光照文件,就手动烘培一次
Ambient Occlusion墙角效果
Lightmap Size越小,烘培越快,文件越小
为了避免ReflectionProbe将物体本身录入其中形成黑色区域,应该把物体设置到Reflection这个摄像机拍不到的图层里面。
注意ReflcetionProbe跟物体要没有相对距离!
Refresh Mode决定性能消耗
Importance很重要,决定各个probe之间的权重
可以在lighting面板里的右下角单独烘培反射探针
灯光探针一定要在灯光有变化的区域放置
例如阴影内外,不同颜色交换的区域
储存阴影信息的探针一定要在阴影里
储存亮部信息的探针一定要在亮部里
颜色同理
场景切换状态模式 这一章看了两遍
第一遍看了跟着做 第二遍又看了一回复习,
然后又跌跌撞撞的反复删了重写好几次 就跟背英语单词一样,有时候总是忘记下一步要写什么。。
int arg那块突发奇想 将挂载的脚本中写一个枚举
然后把int arg 改成枚举类
将挂载的脚本中方法context.handle(枚举变量)丢入update中运行
public class StateA : IState
{
Context mContext;
public StateA(Context context) {
mContext = context;
}
public void Handle(GameState gameState)
{
Debug.Log("StateA.Handel"+ gameState);
if (gameState==GameState.MENU)
{
mContext.SetState(new StateB(mContext));
}
}
}
public enum GameState {
LOGO,
MENU,
GAME
}
public class UseDM : MonoBehaviour {
public GameState gameState;
Context context;
void Start () {
context = new Context();
context.SetState(new StateA(context));
}
private void Update()
{
context.Hanlde(gameState);
}
}
maincamera删
查询的时候用limit
select * from mytable limit 2;
意思是只显示mytable这个表中的前两个数据
select * from mytable limit 2 4;
意思是只显示mytable这个表前2条数据不算,从第3条开始显示4条
表格建好后 插入数据
insert into 表名(属性名,属性名,...) values (内容 , 内容,...)
insert into mytable(username , password) values ('张三' , '123456');
查询表内容
select * from 表名
select * from mytable;
修改表中数据
update 表名 set 属性名 = 内容 , 属性名 = 内容 , ... where 限制
1.update mytable set username = 'sun' , password = '123.qwe' where id = 1;
这个是修改id是1的username为sun和password为123.qwe
2.update mytable set username = 'sun1' , where id = 1;
这个是修改id是1的username为sun1
如果没有限制条件 默认修改所有的
删除数据
delete from 表名 where 限制
delete from mytable where id = 2;
删除id是2的数据
启动sql
net start mysql
关闭sql
net stop mysql
看某个sql show tables; 看之前要选一个数据库
use 数据库名;
create database 数据库名 创建数据库
drop database 数据库名 删除数据库
create table 表名 (内容) 创建表 需要先选择一个数据库
primary key(一个属性的名字) 将该属性设置成主键
属性名字 int 创一个整型
auto_increment 自增
carchar(length) 字符串
创建一个表名是mytesttable的表,属性有id(int类型 自增 , username 字符串类型长度30 , password 字符串类型长度30 , 设置主键为id)
create table mytesttable(id int auto_increment,
username varchar(30),
passworld varchar(30),
primary key(id));
查看表结构
desc 表名
这里应该可以把common项目的输出路径设置为unity项目的Plugin文件夹。生成MyGameServer项目时由于引用了common项目,会同时编译common项目到MyGameServer的输出文件夹。这样就不用手动去拖拽common.dll到unity里了。
提个醒,本视频7分钟左右,视频被剪辑了,但遗漏了部分代码的讲解,此处在解锁状态的判断中,凭空出现了hasRigisterEvent注册事件的判断,先前的条件语句是在此条件下执行的。
完整的看完了,现在对设计模式也是略懂。这里我整理以下我跟着siki老师做到最后,siki老师留下的bug和没做的。当然这毕竟是一个学习设计模式的Demo,不可能有多完整,有些可能只是我的强迫症吧2333.至少证明我认认真真看完了
bug并不太多,其实都看设计模式了,代码功底应该很强了。
1.用责任链模式做的关卡系统最后一关有空引用的bug,也就是没有判断当前关卡是不是最后一关,解决办法是判断下有没有下一关的引用,如果引用是null,则当前关是最后一关,完美解决。
2.兵营UI显示该兵种数量没有做。其实访问者模式已经把大体框架搭好了,只要加些参数,并将RunVisitor在往具体战士类重写,就做好了。
3.当前关卡显示。这也是一个小问题,有两个地方要显示更新关卡信息,一个是暂停页面GamePauseUI,一个是游戏状态页面GameStateInfoUI。这里我直接在这两个UI脚本注册NewStageSubject主题,就可以获取NewStageSubject里面的关卡信息解决。
4.暂停回到开始菜单逻辑,以及GamePaueseUI都没做。这个没啥说的,基本功。暂停 Time.timeScale = 0;就可以了。
5.战士UI显示。基本功,也没啥可说的。
6.个人强迫症,也就是游戏的完整逻辑。游戏胜利,游戏失败。胜利只有一种,那就是打到第9关胜利。失败就是总计敌人走到目标点。这里我用观察这模式写一个敌人到达终点的主题,让GameStateInfoUI注册这个主题,在EnemyChaseState里面判断敌人是否到达目标点,到达则发布主题,并且设置该敌人死亡。
最后,还是有一个小小的缺点,就是UML图画的太草率了,可能是为了照顾初学者。但类与类的六大关系实心空心聚合组合虚线实线箭头我觉得还是不能省略的。
yi'shang
m 静音
03
window timeliness
Dutch(荷兰人) 镜头旋转
screen(屏幕) 旋转x 还是y
04
window timeliness
Dutch(荷兰人) 镜头旋转
screen(屏幕) 旋转x 还是y
下不过自己的AI 哈哈
只使用一个左键点击的方案
类:LearnButton
<
using UnityEngine;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;
public class LearnButton : MonoBehaviour,IPointerClickHandler,IPointerExitHandler,IPointerUpHandler,IPointerDownHandler,IPointerEnterHandler{
/// <summary>
/// 划过选中
/// </summary>
public event Action HighlightedBtn;
/// <summary>
/// 点击选中
/// </summary>
public event Action<PointerEventData> PressedBtn;
public void OnPointerClick(PointerEventData eventData)
{
if (PressedBtn != null)
PressedBtn(eventData);
}
public void OnPointerEnter(PointerEventData eventData)
{
}
public void OnPointerExit(PointerEventData eventData)
{
if (HighlightedBtn != null)
HighlightedBtn();
}
public void OnPointerDown(PointerEventData eventData)
{
}
public void OnPointerUp(PointerEventData eventData)
{
}
}
>
类:CardUI
<
private void Btn_HighlightedBtn()
{
if (Input.GetMouseButton(0))
{
if (card.BelongTo == CharacterType.Player)
IsSelected = !IsSelected;
}
}
private void Btn_PressedBtn(PointerEventData eventData)
{
if (card.BelongTo == CharacterType.Player && eventData.button == PointerEventData.InputButton.Left)
IsSelected = !IsSelected;
}
>