向量的叉积与行列式
参考书籍:
1. 《平面向量和空间向量》-吕学礼-中学生文库-1990
2. 《数理化自学丛书-平面三角函数》,余弦定理和向量点积
3. 《漫画线性代数-欧姆社学习漫画》
向量的叉积与行列式
参考书籍:
1. 《平面向量和空间向量》-吕学礼-中学生文库-1990
2. 《数理化自学丛书-平面三角函数》,余弦定理和向量点积
3. 《漫画线性代数-欧姆社学习漫画》
坐标系转换,也就是计算不同坐标系下某个点的坐标
假设物体A、B 的世界坐标分别为 (2,3,4)、(2,2,3)
计算以 A 为坐标原点时 B 的坐标,即 AB=B-A=(2,2,3)-(2,3,4)=(0,-1,-1)。
在物体A上挂载脚本并执行:
// 物体 A 的世界坐标为 (2,3,4)
// 物体 B 的世界坐标为 (2,3,3)
Vector B = new Vector3(2,3,3);
// 打印以 A 为坐标原点时的坐标系中 B 点的位置
Debug.Log(transform.InverseTransformPoint(B)); // 打印 [0.00,0.00,-1.00],也就是坐标 (0,0,-1)
假设物体 A 的世界坐标为 (2,3,4)
若以物体 A 为坐标原点时,有一个坐标为 (2,3,3) 的物体 B,计算物体 B 的世界坐标,即 B+A=(2,2,3)+(2,3,4)=(4,6,7)。
在物体A上挂载脚本并执行:
// 物体 A 的世界坐标为 (2,3,4)
// 当以物体 A 为坐标原点时,物体 B 的坐标为 (2,3,3)
Vector B = new Vector3(2,3,3);
// 打印以物体 B 的世界坐标
Debug.Log(transform.InverseTransformPoint(B)); // 打印 [4.00,6.00,7.00],也就是坐标 (4,6,7)。
得,果然是无限套娃,我还在好奇它的费用是怎么传递的,结果还真是;
若有两个坐标:A(1,2,3), B(2,3,4)
将 B 放置到 A 物体下使 B 成为 A 的子物体。
那么此时的 B 坐标为向量 AB=B-A=(2-1, 3-2, 4-3)=(1,1,1)
这个例子举得真的是一点都不方便, 不如直接拿数据保存举例, 套壳使用另一种方式保存数据
果然是套壳, 我愿称之为皮包公司模式
为什么不使用事件呢,现在还要单独写个类,观察者模式本身就是谁需要谁注册,被观察者进行触发的流程; 本身用事件的方式去添加方法,逻辑上也是一样的, 真没必要搞得这么绕,其流程是一样的,都需要对stageSystem进行修改操作;
他写的太绕了,看的难受,重新写了下
//示例
public class _09ObserverMode : MonoBehaviour
{
private void Start()
{
//
S1 s1 = new S1();
Observer ob1 = new Observer("ob1");
Observer ob2 = new Observer("ob2");
// 订阅事件
s1.Add(ob1);
s1.Add(ob2);
// 状态变化,通知所有观察者
s1.State = "温度 37";
// 取消订阅示例
s1.Remove(ob1);
s1.Remove(ob2);
}
}
//观察者
public class Observer
{
// 名称
private string name;
// 构造函数
public Observer(string name)
{
this.name = name;
}
// 更新
public void Update(string str)
{
Debug.Log(name + " 收到了通知,更新了 " + str);
}
}
//定义被观察者
public class Subject
{
// 定义事件
private Action<string> onEvent;
// 订阅事件
public void Add(Observer ob)
{
this.onEvent += ob.Update;
}
// 取消订阅事件
public void Remove(Observer ob)
{
this.onEvent -= ob.Update;
}
// 触发事件,通知所有观察者
public void Trigger(string str)
{
this.onEvent?.Invoke(str);
}
}
//实现被观察者
public class S1 : Subject
{
// 状态
private string mState;
// 属性
public string State
{
get
{
return this.mState;
}
set
{
// 状态变化,通知所有观察者
this.mState = value;
this.Trigger(value);
}
}
}
其实真没必要搞那么麻烦,直接在角色系统那边增加两个死亡列表就行,然后让IEnemy和ISoldier死亡后通过GameFacade调用方法添加到死亡列表,最后和视频一样,在CharacterSystem的Update中处理死亡列表
其实在这一块可以顺便教一下SO; 注意模型名字错了
这个升级兵营 武器 训练士兵,里面的逻辑也拆的太散了吧,这种方式大可不必吧,而且兵营UI属于表现层, 没必要把判断逻辑放在这里面
IEnumerator LoadResourceCorotine(string resName
UnityWebRequest request=UnityWebRequest.GetAssetBundle
yield return request.SendWebRequest();
AssetBundle ab=request.downloadHandler as DownloadHandler).assetBundle;//将下载的内容作为ab包
GameObject gameobject=ab.LoadAsset<GameObject>(resName)
prefabDict.Add(resName,gameObject)
}
private void JoyStick(|int padId,vector2 pos){
if(padId!=PadID||IScHOOSE)return;
}
public static void CreateUser(string userName,string pwd){
}
登录成功,把用户的online改为在线状态
this.btn_Login.on(Laya.Event.CLICK,this,this.OnLoginBtnClick);
OnLoginBtnClick(){
}
创建一个Server.js
var server=require("socket.io")(9000)
server.on("connection",function(socket){
console.log("客户端连接"+socket)//socket参数表示客户端连接对象。用socket监听是否断开
socket.on("disconnection",function(){
})//检测客户端断开
socket.on("Msg",function(str){
console.log(str)
socket.emit("Server_Msg",123,"Hi I am server");//服务器端给客户端发消息
});//接收客户端发来的消息
})
在Laya中创建一个ClientManager.js
导入socket.io.d.ts
export default class ClientManager extends Laya.Script{
constructor(){
super();
}
OnAwake(){
var socket=io.connect("ws://localhost:9000");//传递服务器的地址
socket.on("connect",function(){
console.log("连接成功");
});//监听客户端是否连接成功服务器
socket.on("connect_error",function(){
console.log("连接失败");
});//监听客户端是否连接成功服务器
Laya.stage.on(Laya.Event.MOUSE_DOWN,this,function(){
socket.emit("Msg","给客户端发送消息");//第一个参数表示协议,服务端必需也是监听同样的协议,才能接收到消息
});//鼠标按下时向服务器发送消息
}
}
创建一个Server.js
var server=require("socket.io")(9000)
server.on("connection",function(socket){
console.log("客户端连接"+socket)
socket.on("disconnection",function(){
})//检测客户端断开
})
在Laya中创建一个ClientManager.js
导入socket.io.d.ts
export default class ClientManager extends Laya.Script{
constructor(){
super();
}
OnAwake(){
var socket=io.connect("ws://localhost:9000");//传递服务器的地址
socket.on("connect",function(){
console.log("连接成功");
});//监听客户端是否连接成功服务器
socket.on("connect_error",function(){
console.log("连接失败");
});//监听客户端是否连接成功服务器
}
}
老师,请问一下人物行走最后停下来是面对行走的方向应该怎么实现?现在只要一停下来就会自动
关于查找父物体下子物体可以改成如下
//从父物体下找到对应名称子物体
public static Transform FindChild(GameObject father, string name)
{
Transform[] childList = father.GetComponentsInChildren<Transform>();
Transform child = null;
bool isFinded = false;
foreach (var temp in childList)
{
if (temp.name == name)
{
if (isFinded == true)
{
//查找是否有重名的 //缺点是要把整个列表都遍历一遍
Debug.Log(father.name + " 下存在重名的物体 " + name);
}
else
{
child = temp;
isFinded = true;
}
}
}
return child;
}
public static T FindChild<T>(string fatherName, string name)
{
GameObject father = GameObject.Find(fatherName);
return FindChild(father, name).GetComponent<T>();
}