矢量计算公式,ab+bc=ac,a指向c
ab-ac=ab+ca=cb,c指向b,减数指向被减数。
矢量计算公式,ab+bc=ac,a指向c
ab-ac=ab+ca=cb,c指向b,减数指向被减数。
记录踩的一个小坑
Vector.Angle返回0~180,不会为负数。
//这种写法有问题
float k = mousePos.x > transform.position.x ? Vector3.Angle(Vector3.up, transform.position - mousePos) : Vector3.Angle(Vector3.up, mousePos - transform.position);
//这种写法ok
float k = mousePos.x > transform.position.x ? -Vector3.Angle(mousePos - transform.position, Vector3.up) : Vector3.Angle(Vector3.up, mousePos - transform.position);
lv % 10 的结果为 0~9,不可能出现大于等于10的数字,后面的内容是多余的。
Canvas三种模式
Screen Space-camera:
Screen Space-Overlay:
最后的UI 金币提示器
新创一个canvas来控制层级 没设一个canvas 都要改成camera
文本框与父物体上下左右对齐
才发现改了锚点之后坐标也会改 原来是根据锚点为原点
枪口随着鼠标旋转
脚本
获取旋转 鼠标与枪口所指位置的连线的夹角
获取鼠标位置 因为canvas有缩放 所以涉及到screentoworldpoint 把屏幕坐标转为世界坐标的方法不好在这用
UGUI有方法 拿到canvas与camera 在再update里给个变量接受传出来的坐标
算夹角 用该方法 先获得z(旋转) 夹角正负判断 Vector3.up是该gameObjects所指向的向量
再进行旋转 localRotation 全部放入代码库
给所有枪都挂上 拖的是90canvas
Gun 的绘制 不用UGUI 直接拖 用sprite render 混合使用 (枪的拼接不能用同一个canvas层类来解决)
可能会特别小 直接放在外面 render 层级设100
统一使用100缩放 所有枪都用空物体归类 零件因为放在枪的子物体 所以scale是111 层级99 枪管layer98
设3号枪之前可以把2号枪先禁用掉
可以直接复制组件坐标!!!
空物体归类 锚点对齐
两个button
取消滑动条按钮在游戏内的交互
滑动器 锚点是根据父物体来的
UI slider 把Handle 删掉 Bg/filled area /fill alt四角拉伸
按alt按当前中心点缩放
渲染顺序
1 canvas layer beside tag 逻辑 只有32个 已有官方8个
2 order in layer 0123
把canvas改成0层再创个新的90(相机模式拖了摄像机才有)
在90C下创建UI Sprite Swap button被按下时切换图片 ctrld之后scale可能会变 记得手动set native size
才发现自适应会帮我做锚点
UGUI中空物体归类 锚点alt最大四角
倒计时制作两个文本 一个先取消勾选(整个物体的钩) 倒计时结束后再出现
主场景
创建一个平面(是单面显示的 把它对着摄像机)旋转x-90 覆盖大小 去掉碰撞器 拖上材质资源
特效脚本
切换材质球图片 数组法 直接调主材质 数组索引取模轮回法来设置上限 InvokeRepeating代替update 每隔0.1f
气泡特效的添加 整理 用空物体收纳时记得把空物体归零(reset)不然会影响zuo'biao
习惯
mode 第三个是做3Dui的 一般用第二个
image 加button 再在底下加文字 alt 全放大
加outline,shadow
看不到气泡的话,在3D模式下改Z轴的值
Ctrl+N;//创建新场景
解决不来了
老师在吗
我理解的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//实现枪炮跟随鼠标移动
public class GunFollow : MonoBehaviour
{
public RectTransform UGUICanvas;//之所以将RectTransform类型命名为画布,是因为我们需要得到坐标,有需要我们看懂代码指的是什么
public Camera mainCamera;
private void Update()
{
//本地坐标转换位世界坐标
Vector3 mousePos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(UGUICanvas, new Vector2(Input.mousePosition.x, Input.mousePosition.y), mainCamera, out mousePos);
//判断z轴位置的正负,分清左右
//屏幕左下角(0,0)右上角是(width,height)
float z;
if(mousePos .x>transform .position.x)//鼠标点在炮塔的中线右边(按照预期炮塔向右转动)
{
z = -Vector3.Angle(Vector3.up, mousePos - transform.position);
//之所以要添加 - ,是因为在炮塔的角度测试中,向右转,z轴是变成负数的
//Vector3.Angle(Vector3.up, mousePos - transform.position),而这一句意思是炮塔向前方转动,并由炮塔所在位置指向鼠标位置。
//Angle在API介绍文档中永远大于0而小于180,所以要在整个语句之前加上 - 再赋值给z轴。
}else
{
z = Vector3.Angle(Vector3.up, mousePos - transform.position);
}
//子物体的旋转跟随父物体:炮塔的旋转跟随父物体2Gun,3Gun,...
transform.localRotation = Quaternion.Euler(0, 0, z);
}
}
CloseButton
ScripsHolder
MainScene