画布的渲染模式分为三种:第一种Overlay意为画布里面的东西会永远按比例显示在摄像机的最前面,这样不利于粒子特效等的显示,所以这里不采用
第二种Camera意为把画布画到摄像机的正交位置上
画布的渲染模式分为三种:第一种Overlay意为画布里面的东西会永远按比例显示在摄像机的最前面,这样不利于粒子特效等的显示,所以这里不采用
第二种Camera意为把画布画到摄像机的正交位置上
可延伸枪随点击旋转,这样可以发布手游来玩
我理解的代码
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);
}
}
private static GameController _instance;
public static GameController Instance
{
get
{
return _instance;
}
}
单例模式 让其他脚本获取这个脚本 使用它的成员
其中_instance是在Awake赋值
_instance=this
ck是fw
实例:unity延时方法Invoke和InvokeRepeating
Invoke(methodName: string, time: float): void;
methodName: 方法名
time:多少秒后执行
InvokeRepeating(methodName: string, time: float, repeatRate: float): void;
methodName: 方法名
time:多少秒后执行
repeatRate:重复执行间隔
还有两个重要的方法:
sInvoking:用来判断某方法是否被延时,即将执行
CancelInvoke:取消该脚本上的所有延时方法
如果遇到这种情况,检查下图片的z轴在哪里。
老师在开车。
InvokeRepeating: 重复调用方法名为传进去字符串参数的方法,在指定的时间间隔后按一定的速率(秒)调用
发布游戏后,发现没有鱼出来~而且分辨率不正确的同学不要着急。
首先去Main场景,在Canvas0,Canvas90,Canvas180里,找到属性"Canvas Scaler",然后看到第一个下拉框"UI Scale Mode",将值改为"Scale With Screen Size",然后填写你的项目的分辨率就ok了~
然后你会发现很多物体的大小的变得很奇怪,没办法了,只能一个一个改。
1.Camera.ScreenToWorldPoint:转变position从屏幕空间到世界空间。屏幕空间以像素为单位定义。屏幕的左下角是(0,0);右上角是(pixelWidth,pixelHight)。z位置是相机的世界单位。
2.Event.mousePosition:鼠标位置。用于EventType.MouseMove和EventType.MouseDrag事件。窗口的左上角返回(0,0)。右下角返回(Screen.width,Screen.height)。
以上两种方法不太适合用于UGUI。
可以用UGUI中已经封装好的的方法:ScreenPointToWorldPoint。
3.public static bool ScreenPointToWorldPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam,out Vector3 worldPoint);
参数
{矩形 : RectTransform在里面找到一个点。
凸轮: 相机与屏幕空间位置相关联。
screenPoint : 屏幕空间位置。
worldPoint : 指向世界空间。}
将屏幕空间点转换为位于给定RectTransform平面上的世界空间中的位置。
cam参数应该是与屏幕点相关联的摄像机。对于Canvas中设置为Screen Space - Overlay模式的RectTransform,cam参数应为null。
当从提供PointerEventData对象的事件处理程序中使用ScreenPointToWorldPointInRectangle时,可以使用PointerEventData.enterEventData(用于悬停功能)或PointerEventData.pressEventCamera(用于单击功能)来获取正确的摄像机。这将自动为给定事件使用正确的相机(或null)。
float Angle(Vector2 from, Vector2 to)
Camera.ScreenToWorldPoint
Input.MousePosition
因为缩放问题故不用这两个方法获取游戏鼠标位置
Part
GunPanel dizuo5
Left dizuo2
Right dizuo4
GunBase dizuo1
Button
ButtonP jia1 Button:jia2
ButtonM jian1 Buttion:jian2
老师又开che
overlay 覆盖。。
camera 不同层级啊渲染
wordspace 在3d世界中给任务添加一个血条。。
导入的Gold的Scale需改为1
粒子特效。 不
plane 做水波纹
camera depth