基础知识总结+扇形攻击代码+摄像机跟随代码+控制玩家移动和射线检测玩家旋转

本文深入讲解Unity游戏开发中关键的编程技巧,包括物体旋转、触发与碰撞检测、实例化、按钮响应时间设置、协同编程、碰撞物体判断、错误捕捉、脚本动态挂载与禁用、层设置以及输入轴差异等。同时,提供了摄像机跟随、玩家移动控制和射线检测的具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.rotation是什么类型的 让一个物体旋转 45,90,90 代码的书写?
四元数类型 transform.ratotion = Quaternion.euler(45,90,90);

2.触发和碰撞的区别和联系 tag 和层的用法
区别:触发需要勾选Is Trigger 可以穿透 tag多用于触发和碰撞,层多用于射线.

3.实例化物体 instantiate() 参数有几个 若一个参数返回类型是什么 三个参数返回类型有几个
可以一个参数也可以三个参数 参数类型为 object vector3 rotation

4.对一个按钮动态添加响应时间的代码

gameobject.GetComponent<button>.Addlisten(方法);

5.协同可以传递参数吗? 参数类型是什么
可以传递 类型为object

6.在碰撞检测中我们是怎么样判断是哪种物体进入我的碰撞里面
通过tag进行判断 对象名字也可以

7.如何捕捉在程序运行时候的错误
try catch

8.脚本动态挂载代码 脚本禁用代码
enabled组件的激活 禁用 SetActive 是 GameObject中的方法用来激活 禁用游戏对象.

9.写出得到某一个层的两种方式 1<<X
LayerMask.GetMask("");

10.Input.GetAxisRow 和 Input.GetAxis区别
GetAxisRaw不使用平滑滤波器
就是说GetAxis可以返回-1到1之间的数,比如检测到按键按下的时候,由0不断增加过渡到1
GetAxisRaw只能返回-1,0,1三个值

扇形攻击代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class S4Player : MonoBehaviour {

	void Start () {
	}
	void Update () {
		if (Input.GetKeyDown(KeyCode.P))  //玩家按P键进行攻击
		{
			AttackEnemy();
		}
	}
	void AttackEnemy()
	{
		//获取在球形范围里面的碰撞框
	Collider[] _colliders =	Physics.OverlapSphere(transform.position, 5);
		//   符合要求的敌人列表
		List<GameObject> AttackdList = new List<GameObject>();
		//筛选完毕
		foreach (var v in _colliders)
		{
			//判断是否在攻击角度里面 
			if (UmbrellaAttact(transform, v.transform, 60, 5))
			{
				AttackdList.Add(v.gameObject);
				Debug.LogError(v.name);
			}
		}
           //进行伤害计算
		foreach (GameObject o in AttackdList)
		{
			//获取距离
			float dis = Vector3.Distance(transform.position, o.transform.position);
         //计算减血数值多少 离玩家越近收到的伤害越高
			float blood = 5 * 10 / dis;
			//进行减血
			o.GetComponent<S4Enemy>().Attacked(blood);
		}
	}
	//封装好的攻击方法 返回bool值
	private bool UmbrellaAttact( Transform  attacker ,Transform attacked  ,float  angle, float radius)
	{
        
		Vector3 deltaA = attacked.position - attacker.position;
        
		float tmpAngle = Mathf.Acos(Vector3.Dot(deltaA.normalized, attacker.forward)) * Mathf.Rad2Deg;
        
		if (tmpAngle < angle * 0.5f && deltaA.magnitude < radius)
		{
			return true;
		}
		return false;
	}

}

摄像机跟随代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MainCameraCtr : MonoBehaviour {
    public int Speed;//定义速度变量
    public Transform TagTransform;//要跟随的物体
    private Vector3 offset;//一个向量,即摄像机与物体间的差值

	// Use this for initialization
	void Start () {
        Speed = 5;//定义速度为5
        offset = transform.position - TagTransform.position;//摄像机与物体间的差值
    }
	
	// Update is called once per frame
	void Update () {
		
	}
     void LateUpdate()
    {
        Vector3 newpos = TagTransform.position + offset;//摄像机新的位置信息为跟随物体的坐标+差值
        //线性插值,在 Speed * Time.deltaTime摄像机位置移动从之前位置开始到newpos结束
        transform.position = Vector3.Lerp(transform.position, newpos, Speed * Time.deltaTime);
    }
}

控制玩家移动和射线检测玩家旋转

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour {

    private Rigidbody _rig; //刚体
    private float speed;  //玩家移动速度
    private float h, v;  //横向纵向虚拟轴
    private Vector3 playerposition;  //玩家位置
    private Animator animator;   //动画控制器
    private Camera _mainCamera;  //相机

    void Start () {
        _rig = GetComponent<Rigidbody>();
        if (_rig == null)
        {
            _rig = gameObject.AddComponent<Rigidbody>();
        }
        animator = GetComponent<Animator>();
        speed = 5f;
        h = 0;
        v = 0;
        _mainCamera = Camera.main;
    }

    void Update () {
		
	}

    private void FixedUpdate()
    {
        h = Input.GetAxis("Horizontal");
        v = Input.GetAxis("Vertical");
        playerposition.Set(h, 0, v);
        playerposition = playerposition.normalized * speed;
        _rig.MovePosition(transform.position + playerposition * Time.deltaTime);

        #region 射线检测旋转
        Ray _ray = _mainCamera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(_ray, out hit, 100, 1 << 8))//将地面设置为第八层
        {
            //保持玩家的Y一样  背会
            Vector3 posVector3 = new Vector3(hit.point.x, transform.position.y, hit.point.z);
            posVector3 = posVector3 - transform.position;
            transform.rotation = Quaternion.LookRotation(posVector3);
        }
        #endregion
        
        bool isMove = h == 0 && v == 0;
        animator.SetBool("Move", !isMove);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值