16379人加入学习
(115人评价)
Unity中级案例 - 捕鱼达人(Unity5.6.4)

制作于2017.12.14

价格 免费

画布的渲染模式分为三种:第一种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

[展开全文]

实例: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)。

4.Vector2 .Angle

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

 

[展开全文]

overlay 覆盖。。

camera 不同层级啊渲染

  wordspace 在3d世界中给任务添加一个血条。。 

[展开全文]

授课教师

SiKi学院讲师

课程特色

图文(1)
视频(41)
下载资料(1)