Unity常用API
1.Reset()方法,重置
private void Reset(){
Debug.log(“调用了重置方法”)
}
2.Awake()方法,正常初始化需要使用构造函数【Gameobject gb = new Gameobject()】,unity这里,组建的初始化不适用构造函数,用Awake()方法。
3.OnEnable()函数。每次游戏或脚本被激活都会调用一次,重复赋值变成初始状态。
4.update()函数,每帧都调用
5.lateupdate()函数,在调用所有update后调用。例如摄影机跟随,一定是人先动,摄影机才会跟随
6.OnDisable()函数,满足调用情况是即时调用一次,用于一些对象的状态重置,资源回收和清理。例如游戏物体被销毁,脚本呢组件被禁用。
7.OnApplicatoinQiut()函数,满足调用情况是即时调用一次,用于处理游戏瑞出后的逻辑,。
8.OnDestroy()函数,满足调用情况是即时调用一次,用于游戏物体的销毁,例如脚本被移除,脚本挂载到的物体被删除。
9.在自己组件中引用(查找)其他物体
用Gameobject.find(“查找物体的名字”)方法,再赋值。
Gameobject maincam = Gameobject.find(“应用物体的名字”)
10.查找其他物体方法2通过标签查找
Gameobjec.FindGameObjectWithTag(“查找物体的名字”)
Gameobject maincam = Gameobjec.FindGameObjectWithTag(“应用物体的名字”)
11查找多个物体同一个标签下的。也是查他们的标签,然后for遍历一下输出,因为十多个物体所以用数组接收。
Gameobject[] GBO=Gameobect.FindGameObjectWithTag(“标签名字”);
for(i=0;i<GBO.length;i++){
debug.log("名字是"+GBO[i].name);
}
12.自身坐标正方向
Debug.log(ziji.forward);向右Debug.log(ziji.right);向上Debug.log(ziji.up);
13计算向量之间夹角Angle()函数
Vector2 va = new Vectoe2(2,0);
Vector2 vb = new Vectoe2(2,2);
print("无符号夹角是"+Vector2.Angle
print("有无符号夹角是"+Vector2.SignedAngle(va,vb));
print("点积是"+Vector2.Dot(va,vb));
print(“va和vb再各个方向上的最大分量组成的新向量”Vector2.max(va,vb));
print(“相连的差值”vector2.Lerp(va,vb,0.5f));
float maxDDistance = 0.5f //浮点数加f
print("将va以最大距离不超过maxDistance为移动步频移向vb“+Vector2.MoveTowards(va,vb,maxDisrance));
14.lerp差值
15.moveTowards(起始位置,目标位置,速度)移动
ziji.position = VEctor2.MoveTowards(ziji.position,targettrans.position,0.5f)
16.SmoothDamp(起始位置,目标位置,速度,平滑时间)平滑阻尼
17.玩家移动//上面那俩是按下按键人物会有一个渐变得过程跑起来,下面那俩直接跑起来
print ("当前玩家水平移动的轴值"+Input.GetAxis("Horizontal")); // 可以定义一个变量去接收他们
print ("当前玩家垂直移动的轴值"+Input.GetAxis("Vertical"));
print ("当前玩家水平方向的边界轴值"+Input.GetAxisRaw("Horizontal"));
print ("当前玩家垂直方向的边界轴值"+Input.GetAxisRaw("Horizontal"));
print("鼠标水平"+Input.GetAxis("Mouse X"));
print("鼠标垂直"+Input.GetAxis("Mouse Y"));
//连续检测(事件)
if(Input.GetButton(Fire1)) //Fire1对应鼠标左键,可更改
{
print("玩家正在使用武器1")
}
if(Input.GetButton(Fire)) //Fire2对应鼠you键
{
print("玩家正在使用武器1")
}
//间隔检测(事件)
if(Input.GetButtonDown("Jump"))
{
print("玩家正在按下跳跃键")
}
if(Input.GetButtonUP("Squat"))
{
print("玩家正在松开跳跃键")
}
if(Input.GetKeyDown("Q"))
{
print("玩家正在按下Q键")
}
if(Input.anyKeyDown)
{
print("玩家正在按下任意键")
}
if(Input.GetMouseButton(0))
{
print("玩家正在按住鼠标左键")
}
if(Input.GetMouseButtonDown(1))
{
print("玩家正在按住鼠标右键")
}
if(Input.GetMouseButtonUp(2))
{
print("玩家正在抬起鼠标中键,从按动中抬起")
}
GetKey传入参数为按键名称或KeyCode,而GetButton、GetAxis传入参数只能为InputManager中定义的轴键。
GetKey,GetKeyDown,GetKeyUp可以通过传入String类型的按键名称来获得按键。
18.随机数
print(Random.rotation+"随机出的旋转数是以四元数形式表示")
print(Random.rotation.eulerAngles+"四元数转换成欧拉角")
print(Quaternion.Euler(Random.rotation.eulerAngles)+"欧拉角转成四元数")
print(Random.value+"随机出【0,1】的浮点数")
print(Random.insideUnitCircle+“再(-1,1)~(1,1)范围内随机生成数”)
print(Random.Range(0,4)+"在区间【0,4)随机生成数,包含左不包含右")
print(Random.Range(0,4f)+"在区间【0,4)随机生成数,包含左包含右")
19.鼠标事件
private void OnMouseDown(){} //按下鼠标
private void OnMouseUp(){} //抬起鼠标
private void OnMouseDrag(){} //拖拽鼠标
private void OnMouseEnter(){} //鼠标移入到物体
private void OnMouseOver(){} //鼠标悬停
private void OnMouseUpAsButton(){} //鼠标再物体身上松开了
20.消息发送
GameObject.sendMessage(“”) //给自己发消息
GameObject.
20.协程
作用1:延时调用,比如“敌军将在30s后到达战场”
作用2:等某个操作完成后在执行后面的代码
简单来说,协程就是,你顺序的写一段代码,然后标明哪里需要暂停,然后一段时间后,系统就会执行这段代码。
IEnumerator ChangeState(){ //IEnumerable及IEnumerable的泛型版本IEnumerable是一个接口
//暂停几秒(yield协程挂起)
yield return new WaitForSeconds(2);
ziji.play(“walk”);
yield return new WaitForSeconds(3);
ziji.play(“Run”);
}
然后再start()里面开启协程 StartCoroutine(“ChangeState”);
StopCoroutine("ChangeState()") //停止协程
yield return null //等待一帧
//以下为重新梳理协程开启关闭
IEnumerator ie = ChangeState();
StartCoroutine(ie);
StopCoroutine(ie);
StopAllCoroutines(); // 关闭所有协程
协程的连续执行
public GameObject giesGo
private int girscount = 5;
private int num;
IEnumerator CreateGris(){ //创建一个协程
While (true)
{
if(num>girscount){yield break;}
}
Instantiate (animator.gameobject);
num++;
yield return new waitforsecond(2);
}
21.Invoke 延时调用
22.刚体
private Rigidbody2d rb;
private float movespeed=1;
private float angle = 20; //定义旋转角度
void start(){
rb = GetComponent<Rigibody2d>();
print(rb.position);
print(rb.gravityScale+"该对象受重力影响程度");
}
void Update(){
rb.MovePosition(rb.position+Vector2.right*moveSpeed*Time.deltaTime);//Time.deltaTime以秒的方式进行
}
//施加一个类似于推力的力的函数
rb.AddForce(Vector2.right*10);
//直接作用在刚体上使其移动
rb.velocity = vector2.right*movespeed;
//使用刚体使物体旋转
rb.moveRotation(90);瞬间旋转90°
rb.moveRotation(rb.ratation+angel*Time.fixeDeltaTime) //正常一直旋转
23.Input控制角色物体移动
public CharacterController playercc;
public Vertor3 mobemotion - Vectoe3.zero;
public forwordspeed = 0.1f;
public float h_value = 0;
public float v_value = 0;
h_value = Input.GetAxis("Horizontal"); //检测水平方向的输入
v_value = Input.GetAxis("Vertical"); //检测垂直方向的输入、
Vertor3 forwordspeed = playercc.transform.forword*v_value*forwordSpeed*Time.deltaTime
moveMotion = forwordspeed
playercc.Move(moveMotion)
//角色跳跃
方法1:if(Input.GetKey(Keycode.Space)){Vertor3 upmovespeed = playcc.}
方法2:if (InputGetButton(“Jump”)){}
24相机跟随
public class Follow : MonoBehaviour
{
public Transform playerTransform;
private Vector3 offset;
// Start is called before the first frame update
//控制camera跟随物体移动:原理:先获取相机和物体之间的距离(位置相减),
//然后相机的位置=物体的位置加上前面算出来的相差距离。
//把要跟随的物体挂在像机的跟随代码上
void Start()
{
offset = transform.position - playerTransform.position;
}
// Update is called once per frame
void Update()
{
transform.position = playerTransform.position + offset;
}
}
25.物体移动
float v = input.GetAxisRaw("Vertical");
transform.Translate(Vector3.forward*v*Time.deltaTime*4);
26.colider 碰撞体,两个物体都添加这个组件才会有碰撞,
is tragger 触发器
27..DoTween
using DG.Tweening;//引入
void start()
{
transform.DOmove(new Vector3(1,1,1),2)//移动到指定点(目标点,时长)
transform.DORotate(new Vector3(50,50,50),2)// 旋转50°
transform.DOScale(new Vector3(2,2,2),2)//缩放
transform.DOPunchPosition(new Vector3)0,1,0),2,3,0.1f);朝指定方向击打
transform.DOShakePosition(2,0.2f,10,90);震动效果
}
//材质方面
Matercial mat1 = GetComponent<MeshRenderer>().material; //获取材质组件
mat1.DOColor(Color.clear,"_TintColor",2); //设置颜色
public Gradient gradient;
mat1.DOGradientColor(gradient,“_TintColor”,2) //设置渐变
mat1.DOOffset(new Vector2(1,1),2); //设置偏移值
//
28.动画创建
必须有动画和动画控制器吧算是,建两个文件夹Animation 和 AnimationController
把几张连续的图片一起拖进层级窗口里,就自动生成一个动画。
发生碰撞的条件,都得有碰撞体,其中一方有刚体,最好是运动的一方有。
ALT + ENTER 调出提示
29. Father f = new son(); //吧son当成father来用
Son s = f as son; //吐过还想用son,再强转过来
30.坦克大战
1.坦克大战的坦克朝向问题:(原理:换按下鼠标方向键时的图片)
图片的渲染是由“精灵渲染器”Sprite Renderer 组件控制,想要改图片可以获取这个组件
private SpriteRenderer sp;然后在private void Awake(){sp = GetComponent<SpriteRenderer>()}中获取
①先监测按键事件 float h = Input.GetAxisRaw("Horizontal");float v = Input.GetAxisRaw("Vertical");
②然后让他移动 ,左右移动transform.translate(Vector3.right*h*movespeed*Time.dealTime,Space.World);
上下移动transform.translate(V
ector3.up*h*movespeed*Time.dealTime,Space
③因为键盘方向键左右分别对应-1到1,上下代表1到-1
④所以if(h<0){sp.sorite = tankSprite[3];}else if (h>0){sp.sorite = tankSprite[2];}
if(v<0){sp.sorite = tankSprite[2];}else if (v>0){sp.sorite = tankSprite[0];}
2.子弹的发射
Ⅰ子弹是做好的预制体,拖到场景中来,得实例化它,所以得先获取public GameObejct bullet;
②然后写一个攻击方法,实例化子蛋 Instantiate(实例化的物体,坦克位置,角度)
③调用攻击方法,最后回到项目中把子弹托给坦克
④修正BUG子弹朝向问题:子弹旋转的角度=当前坦克的角度+子弹应该旋转的角度,给定义一个旋转变量privete Vector3 bulletEulerAngles
Instantiate(实例化的物体,坦克位置,Quaternion.Euler(transform.EulerAngles+buttleEulerAngles))
然后去上面方向那,比如h>0里面加上bulletEulerAngles = new Vector(0,0,-90;
子弹移动transform.Translate(transform.up* moveSpeed*Time.DeltaTime,Space.world);
3.子弹发射的时间间隔
定义一个计时器 private float timeval;
然后if(timeval>=0.4f){Attack();} else {timeval+=Time.deltaTime;}然后每次发射后让它归零timeval = 0;要不就一直发射
4.坦克重生/出生无敌时间写法
①定义一个变量存时间,再定义一个bool变量判断是否处于无敌时间,如果坦克处于无敌时间中,让这个时间变量递减,如果时间小于0则过了无敌时间。
②如何体现无敌:处于无敌时间中时,不使用坦克的死亡和销毁方法.
③添加无敌时间的特效动画,有事先做好的预制体,先获取动画组件public Gameobject boom,然后当坦克处于无敌时间时,激活动画,boom.setActive(true);
5.敌人坦克的移动和自动攻击
移动主要就是通过改变v和h的值(v控制前后,h控制上下),定义一个随机数 int mun = Random.Range(0,4),当mun>2时,v=-1;h=0;当mun<2时,v=0;h=-1。也可以扩大概率,比如把随机数定义成(0,8),然后让mun>3时坦克向下走。
自动攻击就是定义一个时间变量,然后赋个值啥的,再调用攻击方法。
二十:Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy
31。
Global世界坐标,异世界中心为轴
Local本地坐标以物体本身为轴
32.获取物体坐标
Vector3 pos = this.GameObject.transform.position //世界坐标。localPosition本地坐标
也可以简写 Vector3 pos = transform.position
设置新坐标 this.transform.position = new Vector3(1.5f,1,0);
33.Update()帧更新
34.物体移动
Update()
{
float speed =3;
float distance =speed * Time.deltatime; //均匀速度
Vector3 pos = transform.localposition //先获取当前物体位置
pos.x = distance; //给x轴设置个增量
this.transform.localposition =pos;
上面的三行可以写成一行
this.transform.Translate(0,0,distance);
}
35.获取组件
比如获取AudioSource组件
AudioSource audio = GetComponent<AudioSource>();
audio.play();
36获取物体
可按照名称获取GameObject.find(“物体”);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!