Input.GetKey (KeyCode.x)//键盘按键,x是任意按键
transform.Rotate (x,y, z);//旋转,xyz表示坐标方向,Time.deltaTime对应单位时间
transform.Translate (x,y,x)//平移,xyz表示坐标方向,Time.deltaTime对应单位时间
后面加 Space.World表示按照世界坐标移动
if (Input.GetKey (KeyCode.A)) {
transform.Rotate (0,-90 * Time.deltaTime, 0);
}
if (Input.GetKey (KeyCode.D)) {
transform.Rotate (0,90 * Time.deltaTime, 0);
}
if (Input.GetKey (KeyCode.W)) {
transform.Translate (15*Time.deltaTime,0,0);
}
if (Input.GetKey (KeyCode.S)) {
transform.Translate (-10* Time.deltaTime,0,0);
}
transform.GetChild(num) 获取当前物体的子物体,num是从上往下排第几个子物体。
point = transform.GetChild(0);//第一个子物体的位置
让物体始终朝向一个地方transform.LookAt(vector3);
transform.LookAt(target_enemy.transform.position);
共有gameobject会在附上代码后的物体的inspector面板里面的代码界面显示共有变量,直接把物体托上。
私有物体
GameObject.Find (“Cube”);
cube = GameObject.Find ("Cube");
Transform.Find
root.transform.Find("root/AnyChildObjectName")
GameObject.FindWithTag
静态调用,tag不能重复,
cube = GameObject.FindWithTag ("Cube");//这儿是Tag值
GameObject.FindGameObjectsWithTag
先定义一个数组变量
GameObject[] gameObj;
FindGameObjectsWithTag会把标签为player的物体全部放入数组中
gameObj = GameObject.FindGameObjectsWithTag("Player");
Resources.Load
使用这种方式加载资源,首先需要下Asset目录下创建一个名为Resources的文件夹,这个命名是U3D规定的方式,然后把资源文件放进去,当然也可以在Resources中再创建子文件夹,当然在代码加载时需要添加相应的资源路径,括号里面是物体名字。
defense_tower_attack = Resources.Load("Defense_tower_attack")as GameObject;
SystemInfo//读取设备信息
SystemInfo.supportsGyroscope//设备上是否有陀螺仪
Gyroscope//定义一个陀螺仪物体 Gyroscope tuov
Input.gyro//返陀螺仪信息
bool gyinfo;
Gyroscope go;
void Start()
{
gyinfo = SystemInfo.supportsGyroscope;//判断设备是否支持陀螺仪
go = Input.gyro;//返回陀螺仪信息
go.enabled = true;//调用陀螺仪权限
}
Vector3 a = go.attitude.eulerAngles//声明一个三位变量为设备姿态(xyz)
若出现ui重叠,unity会选择最子层显示,若处于同意层会选择最下面的UI显示,如图,三个img处于同一子层,并且空间完全重叠,unity会选择最下面的yallowcar_img为最上层显示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wYdbhQUN-1591431685473)(G:\mc文档\unity.assets\image-20200204165701953.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kvczIgrs-1591431685479)(G:\mc文档\unity.assets\image-20200204165911115.png)]
canvas改变位置方向需要将render mode设置成world space
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZ8eSsdd-1591431685483)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200308000105267.png)]
GUIStyle style = new GUIStyle();//定义一个guistyle
GUI.Label(new Rect(100, 300, 500, 30), “x” + a.x +" "+ “y” + a.y + " " + “z” + a.z,style);//定义一个label
GUI.Label(new Rect(x位置, y位置, x方向长度, y方向长度), 内容(用+分开),style);
void OnGUI()
{
GUIStyle style = new GUIStyle();
style.fontSize = 100;//设置style文字大小
GUI.Label(new Rect(100, 300, 500, 30), "x" + a.x +" "+ "y" + a.y + " " + "z" + a.z,style);
if (draw)
{
// GUI.Label(new Rect(100, 100, 100, 30), "启动失败");
}
}
建立image之后,source image不能直接添加图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dzQC4iYR-1591431685487)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200204163227612.png)]
需改变图片Texture Type选择sprite,点击图片之后如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ut5xSBxy-1591431685491)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200204163604440.png)]
改变image的透明度(color里面的A为透明度)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dfwnyGTY-1591431685494)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200227211527921.png)]
GameObject>>UI>>button
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JsdoaChm-1591431685495)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200113133148396.png)]
pos和width,height分别是位置大小
anchors是锚点位置,锚点位置是确定button在屏幕变化情况下的相对位置,锚点的4个角距离button的4个角的距离时不变的
image是button的外表属性
Add Component>>Event>>Event trigger
Add New Event Type
PointerEnter//指针指向按钮
PointerExit//指针离开按钮
PointerDown//指针按下按钮
PointerUp//指针松开按钮
pointerClick//点击按钮
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h3XgdhO9-1591431685496)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200113133925733.png)]
下面方框位置添加一个GameObject,旁边的方框添加赋在这个GameObjects上面的代码方法(比如移动方法)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JdrPnO6Z-1591431685497)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200113140343030.png)]
注意:场景里面会添加一个EventSystem,这个是用于接受button点击的,所以千万不要误删。
button改变大小不可以通过场景界面直接拖动,应该直接在Inspector里面直接更改width和height,如果直接拖动会保留原来点击范围,点击text拖动大小可改变相对点击范围(白色区域为点击范围)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZ9kPhWI-1591431685498)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200204165137573.png)]
如果改变button的width和height点击范围会随着button大小相对变动。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98V9rvU2-1591431685500)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200308000314793.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u9L6Wh26-1591431685500)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200308000402517.png)]
fill的背景模式
sliced是等比例缩放
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEkMn6rb-1591431685501)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200308000812508.png)]
filled可以直接隐藏为填充背景
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hglit82W-1591431685502)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200308000912288.png)]
1,引用SceneManagement
using UnityEngine.SceneManagement;
2,使用跳转语句SceneManager.LoadScene(“场景名字/ID”);
SceneManager.LoadScene("场景名字/ID",LoadSceneMode.Single);//LoadSceneMode.Single为不保留当前场景
注意:跳转场景不会使场景数据重置
3,SceneManager.GetActiveScene () 获取场景名字(scene.name获取场景名)
Scene scene = SceneManager.GetActiveScene ();
Input.GetKey (KeyCode.值)//监听是否按下
值 对应键
Backspace 退格键
Delete Delete键
Tab TabTab键
Clear Clear键
Return 回车键
Pause 暂停键
Escape ESC键
Space 空格键
Keypad0 小键盘0
Keypad1 小键盘1
Keypad2 小键盘2
Keypad3 小键盘3
Keypad4 小键盘4
Keypad5 小键盘5
Keypad6 小键盘6
Keypad7 小键盘7
Keypad8 小键盘8
Keypad9 小键盘9
KeypadPeriod 小键盘“.”
KeypadDivide 小键盘“/”
KeypadMultiply小键盘“*”
KeypadMinus 小键盘“-”
KeypadPlus 小键盘“+”
KeypadEnter 小键盘“Enter”
KeypadEquals 小键盘“=”
UpArrow 方向键上
DownArrow 方向键下
RightArrow 方向键右
LeftArrow 方向键左
Insert Insert键
Home Home键
EndEnd键
PageUp PageUp键
PageDown PageDown键
F1功能键F1
F2功能键F2
F3功能键F3
F4功能键F4
F5功能键F5
F6功能键F6
F7功能键F7
F8 功能键F8
F9 功能键F9
F10 功能键F10
F11 功能键F11
F12 功能键F12
F13 功能键F13
F14 功能键F14
F15 功能键F15
Alpha0 按键0
Alpha1 按键1
Alpha2 按键2
Alpha3 按键3
Alpha4 按键4
Alpha5 按键5
Alpha6 按键6
Alpha7 按键7
Alpha8 按键7
Alpha9 按键9
Exclaim ‘!’键
DoubleQuote双引号键
Hash Hash键
Dollar ‘$’键
AmpersandAmpersand键
Quote 单引号键
LeftParen 左括号键
RightParen右括号键
Asterisk ‘ * ’键
Plus ‘ +’键
Comma ‘ , ’键
Minus ‘ - ’键
Period ‘ . ’键
Slash ‘ / ’键
Colon ‘ : ’键
Semicolon‘ ; ’键
Less ‘< ‘键
Equals ‘ = ‘键
Greater ‘ >‘键
Question ‘ ? ’键
At ‘@’键
LeftBracket‘ [ ‘键
Backslash ‘ \ ’键
RightBracket‘ ] ’键
Caret ‘ ^ ’键
Underscore‘ _ ’键
BackQuote‘ ` ’键
A ‘a’键
B ‘b’键
C ‘c’键
D ‘d’键
E ‘e’键
F ‘f’键
G ‘g’键
H ‘h’键
I ‘i’键
J ‘j’键
K ‘k’键
L ‘l’键
M ‘m’键
N ‘n’键
O ‘o’键
P ‘p’键
Q ‘q’键
R ‘r’键
S ‘s’键
T ‘t’键
U ‘u’键
V ‘v’键
W ‘w’键
X ‘x’键
Y ‘y’键
Z ‘z’键
Numlock Numlock键
Capslock 大小写锁定键
ScrollLockScroll Lock键
RightShift 右上档键
LeftShift 左上档键
RightControl右Ctrl键
LeftControl左Ctrl键
RightAlt 右Alt键
LeftAlt 左Alt键
LeftApple 左Apple键
LeftWindows左Windows键
RightApple右Apple键
RightWindows右Windows键
AltGr Alt Gr键
Help Help键
Print Print键
SysReq Sys Req键
Break Break键
Mouse0 鼠标左键
Mouse1 鼠标右键
Mouse2 鼠标中键
Mouse3 鼠标第3个按键
Mouse4 鼠标第4个按键
Mouse5 鼠标第5个按键
Mouse6 鼠标第6个按键
JoystickButton0手柄按键0
JoystickButton1手柄按键1
JoystickButton2手柄按键2
JoystickButton3手柄按键3
JoystickButton4手柄按键4
JoystickButton5手柄按键5
JoystickButton6手柄按键6
JoystickButton7手柄按键7
JoystickButton8手柄按键8
JoystickButton9手柄按键9
JoystickButton10手柄按键10
JoystickButton11手柄按键11
JoystickButton12手柄按键12
JoystickButton13手柄按键13
JoystickButton14手柄按键14
JoystickButton15手柄按键15
JoystickButton16手柄按键16
JoystickButton17手柄按键17
JoystickButton18手柄按键18
JoystickButton19手柄按键19
Joystick1Button0第一个手柄按键0
Joystick1Button1第一个手柄按键1
Joystick1Button2第一个手柄按键2
Joystick1Button3第一个手柄按键3
Joystick1Button4第一个手柄按键4
Joystick1Button5第一个手柄按键5
Joystick1Button6第一个手柄按键6
Joystick1Button7第一个手柄按键7
Joystick1Button8第一个手柄按键8
Joystick1Button9第一个手柄按键9
Joystick1Button10第一个手柄按键10
Joystick1Button11第一个手柄按键11
Joystick1Button12第一个手柄按键12
Joystick1Button13第一个手柄按键13
Joystick1Button14第一个手柄按键14
Joystick1Button15第一个手柄按键15
Joystick1Button16第一个手柄按键16
Joystick1Button17第一个手柄按键17
Joystick1Button18第一个手柄按键18
Joystick1Button19第一个手柄按键19
Joystick2Button0第二个手柄按键0
Joystick2Button1第二个手柄按键1
Joystick2Button2第二个手柄按键2
Joystick2Button3第二个手柄按键3
Joystick2Button4第二个手柄按键4
Joystick2Button5第二个手柄按键5
Joystick2Button6第二个手柄按键6
Joystick2Button7第二个手柄按键7
Joystick2Button8第二个手柄按键8
Joystick2Button9第二个手柄按键9
Joystick2Button10第二个手柄按键10
Joystick2Button11第二个手柄按键11
Joystick2Button12第二个手柄按键12
Joystick2Button13第二个手柄按键13
Joystick2Button14第二个手柄按键14
Joystick2Button15第二个手柄按键15
Joystick2Button16第二个手柄按键16
Joystick2Button17第二个手柄按键17
Joystick2Button18第二个手柄按键18
Joystick2Button19第二个手柄按键19
Joystick3Button0第三个手柄按键0
Joystick3Button1第三个手柄按键1
Joystick3Button2第三个手柄按键2
Joystick3Button3第三个手柄按键3
Joystick3Button4第三个手柄按键4
Joystick3Button5第三个手柄按键5
Joystick3Button6第三个手柄按键6
Joystick3Button7第三个手柄按键7
Joystick3Button8第三个手柄按键8
Joystick3Button9第三个手柄按键9
Joystick3Button10第三个手柄按键10
Joystick3Button11第三个手柄按键11
Joystick3Button12第三个手柄按键12
Joystick3Button13第三个手柄按键13
Joystick3Button14第三个手柄按键14
Joystick3Button15第三个手柄按键15
Joystick3Button16第三个手柄按键16
Joystick3Button17第三个手柄按键17
Joystick3Button18第三个手柄按键18
Joystick3Button19第三个手柄按键19
Vector3大多用于表示transform.position(物体的3d坐标,表示物体位置)
Quaternion大多用于transform.rotation(物体的四元数,表示物体方向)
四元数原理以及数学模型:
https://blog.csdn.net/candycat1992/article/details/41254799
如设置物体位置与方向时
transform.position = new Vector3(x,y,z);
transform.rotation = new Quaternion(x, y, z, w);
两个vector3之间的距离
Vector3.Distance(vector3, vector3 )
Vector3.Distance(transform.position, target_enemy.transform.position);
Vector3转化为Quaternion
rotation = Quaternion.LookRotation(Scrollrotation.normalized);
GameObject.Instantiate(Object,Vector3,Quaternion)
第一个参数 Object 是要生成的游戏物体
第二个参数Vector3就是游戏物体的生成位置
第三个参数Quaternion是表示生成的游戏物体是否旋转,一般是不旋转我们用Quaternion.identity表示无旋转
GameObject defense=Instantiate(defense, point.position, Quaternion.identity);//实例化的同时赋值
GameObject.Instantiate(Object,Vector3,Quaternion)//直接实例化
GameObject.Destroy(gameObject,2.0f);
第一个参数gameObject表示要销毁的游戏对象自身
第二个参数2.0f表示2秒后销毁,可以任意指定时间
1.设置物体的激活状态
gameObject.SetActive(bool);
gameobject是激活物体
2.3D物体的显示和隐藏,设置renderer状态
这种方法,相当于是只是隐身的状态,实际上物体还是存在的只是不显示出来而已
一定要先注意,物体有没有Render组件,一般来说需要渲染的物体都有(非UI)
关键要点
gameObject.GetComponent().enabled = bool;
定义刚体
private Rigidbody rigidbody;//定义个刚体名为a
刚体赋值
rigidbody = this.GetComponent();//实例化为当前物体的刚体
给刚体加力(自身坐标)
rigidbody.AddRelativeForce(Vector3.forward , ForceMode.Acceleration);给刚体添加向前的力,Vector3.back/light/right(后/左/右)
给刚体加力(世界坐标)
rigidbody.AddForce(Vector3,ForceMode)//同上
c#获取当前刚体速度
float speed = airshipRigidbody.velocity.magnitude;
添加音源
public AudioSource daojishi;//定义公共一个音源为daojishi
保存代码后在物体inspector板块会出现公共音源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SmfANgqJ-1591431685504)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200131021216650.png)]
将带有音频的物体添加拖进去(一般使用空物体赋音频)
脚本之间调用变量
直接定义脚本名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMlebNSE-1591431685505)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200307235404690.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vxjsnNPZ-1591431685505)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200307235325674.png)]
harm.xxxxx(xxxxx是调用脚本的共有变量)
创建公共静态变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0qbxfyU-1591431685506)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200204163932505.png)]
在其他脚本里面可直接调用,调用公式(脚本名.变量名)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-svhaSdEK-1591431685507)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200204164039603.png)]
私有变量的访问
设置一个访问名称 然后set是条件 get是结果最后返回给访问名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qll8b93c-1591431685508)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200308001540332.png)]
如果是碰撞函数
private void OnTriggerEnter(Collider other)
{
if (other.tag == "end")
{
end = 1;
d = 0;
}
}
private void OnTriggerExit(Collider other)
{
if (other.tag == "end")
{
}
}
碰撞检测通过通过碰撞器触发,通过tag识别,所以碰撞检测的前提是物体要有碰撞器,碰撞器中的Is Trigger是触发器,决定物体是否碰撞到它,如果勾上那么物体不会有碰撞效果,会直接穿过去,只触发函数内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bdkx9ZPC-1591431685509)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200207213154443.png)]
Mathf.SmoothDamp的使用,游戏中用于做相机的缓冲跟踪,这个函数的功能主要是让一个物体像一个指定的位置平滑的移动,比如摄像机的平滑处理
Mathf.SmoothDamp(transform.position.x, target.position.x, ref velocity.x, smoothTime
transform.position.x是当前物体的空间坐标的x轴(y轴、z轴同理)。
target.position.x是target的空间坐标的x轴(y轴、z轴同理)。
velocity是定义的2d或者3d的单位(见下图)。
smoothtime是平滑时间,随着时间的增大平滑速度越来越慢。
public Transform target; //需要移动的位置
public float smoothTime= 0.3f; //平滑时间时间越大平滑速度越慢
private Vector3 velocity; //如果是2d就用vector2,如果是3d就用vector3
void Update ()
{
//直接通过平滑函数设置物体坐标
transform.position = new Vector3(Mathf.SmoothDamp(transform.position.x, target.position.x, ref velocity.x, smoothTime),Mathf.SmoothDamp( transform.position.y, target.position.y, ref velocity.y, smoothTime),Mathf.SmoothDamp( transform.position.z, target.position.z, ref velocity.z, smoothTime));
}
物理运算应该放在FixedUpdate中
(上面表述的是FixedUpdate的更新频率不是按帧率,而是按一个叫做 fixed frame-rate frame,这里我们称其为物理帧。而其更新的默认频率是每秒50次,这个值可以通过项目设置来更改。)
Input检测应该放在Update中
(Update每帧都会被调用)
相机应该放在LateUpate中
(LateUpdate是在所有Update函数运行完以后才开始执行的)
关于fixedupdata详解:
https://www.cnblogs.com/murongxiaopifu/p/7683140.html
Unity3d提供了一个用于本地持久化保存与读取的类——PlayerPrefs。工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值。
PlayerPrefs类支持3中数据类型的保存和读取,浮点型,整形和字符串。
对应的函数分别为:
SetInt();保存整型数据
GetInt();读取整形数据
SetFloat();保存浮点型数据
GetFlost();读取浮点型数据
SetString();保存字符串型数据
GetString();读取字符串型数据
PlayerPrefs.SetString("Name",mName)*;*
PlayerPrefs.SetInt("Age",mAge)*;*
PlayerPrefs.SetFloat("Grade",mGrade)
mName=PlayerPrefs.GetString("Name","DefaultValue");
mAge=PlayerPrefs.GetInt("Age",0);
mGrade=PlayerPrefs.GetFloat("Grade",0F);
连续使用三个image,第一个image作为摇杆载体,viewport是摇杆范围,content是摇杆的杆全部用image代替。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dzA7sSbl-1591431685510)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200304194127600.png)]
这个时候可以把最外层的image的image属性删掉。
我们需要调用unity自带的脚本scroll rect
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9QWzgPYP-1591431685512)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200304221257760.png)]
添加这个脚本后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IDkFvHTU-1591431685513)(C:\Users\sjy\Desktop\学习文档\GO\unity.assets\image-20200304221346493.png)]
会有公共变量
content就是中间的杆,我们把刚刚创建的content(image)放进去 ,然后viewport放进去就好了,再改一下颜色和形状
这个时候已经初步的达到了摇杆的效果了,但是content没有边界,所以我们需要继承了scroll rect给content添加个边界。
这个时候我们删除刚刚的scroll rect,我们自己创建一个空脚本
1.脚本后面MonoBehaviour继承改为scrollrect
2.创建一个浮点型变量radius,来限制content与中心点的距离
3.设置radius的长度为ui大小的0.3倍,因为ui是的位置是rect transform表示的,所以需要转换一下,transform as RectTransform,这样就能获取到sizedelta的大小了,sizedelta后面可以是x也可以是y,因为之前设置的是圆所以是一样的。
4.重写父类接口void ondrag 这个接口是在拖拽content的时候触发的,所以我们限制范围也是在这个函数里面限制,重写这个函数需要在前面添加override,输入ongrag后会弹出提示,选择提示之后,会自动补全base.OnDrag(eventData); 这句话是在父类上调用原接口,如果没有这句话父类的这个函数将不会被调用。
5.创建一个vector2变量取名为pos,让这个pos等于content的锚点位置(content.anchoredPosition),如果直接使用rect transform就是使用当前画册的位置,content会直接移动到左下角,所以用content.anchoredPosition
6.我们让pos不能超过我们刚刚设定的radius,用if语句pos的向量长度(magnitude)打于radius的时候我们就直接将pos的的向量长度等于radius的长度,通过pos的单位长度(normalized)乘以radius的数值就能得到一个radius长度的像向量
7.pos的值设置好了之后,我们需要content满足这个要求,用函数SetContentAnchoredPosition(pos)就可以之间把content的位置设置为pos了,如果使用我们平时用的transform.position,位置指示的也是画布的直至也就是左下角。
写到这里给content限制距离就写完了,接下来就是如何通过这个摇杆控制物体移动了
public class scrollclicle : ScrollRect
{
float radius=0;
public Vector2 outputposition;
// Start is called before the first frame update
void Start()
{
radius = (transform as RectTransform).sizeDelta.x * 0.3f;//设置半径大小为,当前大小的0.3;
}
public override void OnDrag(PointerEventData eventData)//重写父类接口需要添加override,拖拽函数
{
base.OnDrag(eventData);//在父类上调用原接口,这样方便在下面添加代码
Vector2 pos = content.anchoredPosition;
//如果超出了半径,那么content的位置就会成为半径乘以单位向量的位置(设置content的范围)
if (pos.magnitude > radius)//magnitude是返回二维向量的长度
{
pos = pos.normalized * radius;//normalized是返回单位向量,乘以半径也就直线距离
SetContentAnchoredPosition(pos);//通过这个函数控制content的位置
}
}
// Update is called once per frame
void Update()
{
outputposition = content.localPosition / radius * Time.deltaTime;
}
}
1.先定义一个Vector2 变量 outputposition 这个变量用于获取content本地坐标乘以Time.deltaTime控制数值大小,也可以不乘根据实际情况来
2.建立新的脚本,用来控制物体的移动
3.脚本中实例化刚刚的脚本为scroll,然后定义一个私有vector3变量Scrollrotation
4.移动根据实际情况,调用scrollclicle定义的outputposition,outputposition.x是摇杆移动后的横向位置,outputposition.y是摇杆移动后的纵向位置根据实际情况添加在transform.Translate里面
5.根据实际情况把outputposition的x,y赋值给Scrollrotation
6.通过Quaternion.LookRotation函数把Vector3转换成quaternion然后赋值给这个物体的transform.rotation,物体就可以根据实际的情况进行旋转,让正面保持移动
public class movetext : MonoBehaviour
{
public scrollclicle Scroll;
private Vector3 Scrollrotation;
void Update()
{
transform.Translate(10*Scroll.outputposition.x, 0, 10*Scroll.outputposition.y,Space.World);
Scrollrotation = new Vector3(Scroll.outputposition.x, 0, Scroll.outputposition.y);
transform.rotation = Quaternion.LookRotation(Scrollrotation.normalized);
}
}
创建一个list变量
public List enemy_list = new List();//创建一个列表
添加列表元素enemy_list.Add(gameObject)
enemy_list.Add(other.gameObject);//添加进攻击列表
移除列表元素enemy_list.Remove(gameObject);
enemy_list.Remove(other.gameObject);//移除攻击列表
查找列表里面的元素
enemy_list.Contains(gameObject),返回只是布尔
enemy_list.Contains(enemy);//检测列表里面是否有enemy
列表遍历
for (int i = 0; i < enemylist.Count; i++)//遍历所有进入攻击列表的物体
{
target_enemy = enemylist[i];//将攻击目标改为这个物体
}
定义射线变量
private LineRenderer line;//定义一个射线
添加射线属性
line = GetComponent();//添加射线属性
射线开关 line.enabled 布尔值
设置射线位置 line.SetPosition(num,vector3) 第一参数num为0时为起点,为1时为终点,第二参数是位置
public void Line()
{
line.enabled = true;//打开射线
line.SetPosition(0, point.position);//设置射线的起点为炮口
line.SetPosition(1, target_enemy.transform.position);//设置射线的终点为攻击物体
}
();//创建一个列表
添加列表元素enemy_list.Add(gameObject)
```c#
enemy_list.Add(other.gameObject);//添加进攻击列表
移除列表元素enemy_list.Remove(gameObject);
enemy_list.Remove(other.gameObject);//移除攻击列表
查找列表里面的元素
enemy_list.Contains(gameObject),返回只是布尔
enemy_list.Contains(enemy);//检测列表里面是否有enemy
列表遍历
for (int i = 0; i < enemylist.Count; i++)//遍历所有进入攻击列表的物体
{
target_enemy = enemylist[i];//将攻击目标改为这个物体
}
定义射线变量
private LineRenderer line;//定义一个射线
添加射线属性
line = GetComponent();//添加射线属性
射线开关 line.enabled 布尔值
设置射线位置 line.SetPosition(num,vector3) 第一参数num为0时为起点,为1时为终点,第二参数是位置
public void Line()
{
line.enabled = true;//打开射线
line.SetPosition(0, point.position);//设置射线的起点为炮口
line.SetPosition(1, target_enemy.transform.position);//设置射线的终点为攻击物体
}